Як використовувати змінну середовища Docker в масиві ENTRYPOINT?


109

Якщо я встановив змінну середовища, скажімо ENV ADDRESSEE=world, і я хочу використовувати її в скрипті вхідної точки, об'єднаному у фіксовану рядок, наприклад:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

з worldє значенням навколишнього середовища varible, як мені це зробити? Я спробував використовувати, "Hello, $ADDRESSEE"але це, здається, не працює, так як це відбувається $ADDRESSEEбуквально.

Відповіді:


216

Ви використовуєте форму для виконання ENTRYPOINT. В відміну від форми оболонки , то Exec форма не викликає командну оболонку. Це означає, що нормальної обробки оболонок не відбувається. Наприклад, ENTRYPOINT [ "echo", "$HOME" ]не буде робити заміну змінної на $ HOME. Якщо ви хочете оболонки обробки потім або використовувати форму оболонки або виконати оболонку безпосередньо, наприклад: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Під час використання форми exec та виконання оболонки безпосередньо, як у випадку з формою оболонки, саме оболонка робить розширення змінної середовища, а не докер. (З довідки Dockerfile )

У вашому випадку я б використовував форму оболонки

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portпоки ENV port=123. Порт ENV не вирішено. Будь-які ідеї чому?
xetra11

1
Хоча це працює, схоже, це створює нові проблеми, наприклад, не включаючи передані аргументи до цієї точки входу. Наприклад, ви не можете додати --attitude "shouting"аргумент до docker runкоманди, до якої слід перейти./greeting
Daniel F

5
Використовуйте, ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"якщо ви також хочете передати додаткові змінні ./greetingчерез docker runвиклик (або передати CMDDockerfile)
Daniel F

3
Зауважте, що форма оболонки може спричинити передачу сигналів до процесу ( greetingу вашому прикладі). hynek.me/articles/docker-signals
jbg

чи можу я отримати значення змінної середовища у формі exec, наприклад `[myexecutable.sh," $ змінний "], я можу це зробити [[sh", "-c", "echo $ var"], але не таким чином
лазар

13

Я намагався вирішити запропоновану відповідь і все-таки стикався з деякими питаннями ...

Це було вирішенням моєї проблеми:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

Конкретно націлена на вашу проблему:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

здається, ваша відповідь не забезпечує повноцінного вирішення питання ОП
user9405863

Я думаю, я не розумію, як це не дає вирішення питання щодо ОП ... Я оновив приклад для вирішення з точним питанням на увазі.
Бен Кауффман

Ви вже згадали, що ви стикалися з деякими проблемами !!
користувач9405863

правильно, саме тому я ввів нове рішення. ... "прийнята" відповідь не спрацювала для мене, тому я повторююсь із сценарієм оболонки, і це спрацювало.
Бен Кауффман

2
Мені було б цікаво почути ваш підхід тоді @ReverendTim;)
Бен Кауффман

6

Після сильного болю та великої допомоги від @vitr та ін, я вирішив спробувати

  • стандартна заміна басу
  • Оболонка форми з Entrypoint (великий наконечник зверху)

і це спрацювало.

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

напр

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

і

docker run --rm -p 8080:80 -d my-image

обидва встановили порт правильно в моєму контейнері

Реф

дивіться https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.