Передайте ENV в команду запуска Docker - PullRequest
0 голосов
/ 30 октября 2018

Есть ли способ передать переменную, скажем, в этом примере я хочу передать список животных в файл entrypoint.sh, используя ENV animals="turtle, monkey, goose"

Но я хочу иметь возможность пропускать разных животных при работе с контейнером, например docker run -t image animals="mouse,rat,kangaroo"

Как вы передаете аргументы при запуске команды docker run?

Цель состоит в том, чтобы взять эту переменную при использовании команды docker run и вставить ее в этот файл entrypoint.sh

Прямо сейчас я записал жесткий код в моем Dockerfile. Но я хочу иметь возможность сделать это при запуске команды docker run, поэтому мне не всегда нужно изменять Dockerfile.

FROM anapsix/alpine-java:8u121b13_jdk

ENV FILE_NAME="file_to_run.zip"

ENV animals="turtle, monkey, goose"

ADD ${FILE_NAME} .

RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh    

CMD [ "/bin/ash", "./entrypoint.sh" ]

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Похоже, вы путаете сборку образа с запуском контейнера. Если разница между ними не сразу очевидна, я бы порекомендовал ознакомиться с некоторыми другими вопросами и документами, такими как:

В Docker, в чем разница между контейнером и изображением? https://docs.docker.com/develop/develop-images/dockerfile_best-practices/


RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh

С учетом вышеизложенного, переменные будут расширены во время построения образа. Entrypoint.sh не будет содержать ${FILENAME} ${animals}. Вместо этого он будет содержать

file_to_run.zip turtle, monkey, goose

После сборки команда docker run создаст контейнер из этого образа и запустит вышеуказанный скрипт с переменными среды, которые определены, но никогда не используются, так как в скрипте уже есть переменные, раскрытые. Чтобы предотвратить расширение переменной, вам нужно экранировать $ или использовать одинарные кавычки для предотвращения расширения, например

RUN echo "\${FILENAME} \${animals}" > ./entrypoint.sh

или

RUN echo '${FILENAME} ${animals}' > ./entrypoint.sh

Я бы также рекомендовал указывать #!/bin/ash в верхней части этого скрипта. Затем, когда вы запускаете скрипт, не переопределяйте команду с параметрами после имени изображения. Вместо этого установите переменные среды с соответствующим флагом для запуска:

docker run -it -e animals="mouse,rat,kangaroo" image 
0 голосов
/ 30 октября 2018

Самый простой способ, переслать отдельные переменные:

docker run ... --env animals="turtle, monkey, goose" --env FILE_NAME="file_to_run.zip"

Переслать несколько переменных, используя файл:

Или, если вам нужно получить все переменные окружения извне, вы можете сначала сделать что-то вроде этого:

printenv | grep -E 'animals|FILE_NAME' > my-env

grep потому что Docker не любит некоторые переменные, например с пробелами в них, которые вы могли бы иметь в вашей реальной среде.

Затем используйте этот файл в команде Docker:

docker run ... --env-file ./my-env

Последнее также полезно, если вы хотите избежать отправки переменных среды в журналы (например, для конфиденциальных переменных). Я использую этот подход в конвейере CI / CD, который запускает некоторые сценарии.

Использование переменных внутри Docker :

При любом подходе переменные среды фактически становятся доступными для использования сценариями, выполняющимися внутри контейнера.

@ Ответ BMitch содержит более полную информацию о том, как этого добиться в вашем случае, когда у вас есть связанная логика как при сборке, так и при выполнении.

Ссылка

См. Документы здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...