Чи можемо ми передати змінні ENV через рядок cmd під час створення образу докера через файл docker?


80

Я працюю над завданням, яке передбачає створення образу докера на основі centOs, використовуючи файл Docker . Один із кроків всередині файлу docker потребує встановлення змінних ENV http_proxy та https_proxy , щоб працювати позаду проксі.

Оскільки цей файл Docker буде використовуватися кількома командами, які мають різні проксі-сервери, я хочу уникнути необхідності редагувати файл Docker для кожної команди. Натомість я шукаю рішення, яке дозволяє мені передавати змінні ENV під час побудови, наприклад,

sudo docker build -e http_proxy = somevalue.

Я не впевнений, чи вже є варіант, який це забезпечує. Мені чогось не вистачає?


1
у чому проблема з передачею цих під час виконання? Щось на зразок docker run -e http_proxy http://1.2.3.4:3128 -e https_proxy 1.2.3.4:3129? Документ docker run docs.docker.com/reference/commandline/run
user2915097

3
Проблема полягає в тому, що один із кроків у файлі докера викликає yum-установку, і він не вдається, якщо я не встановлюю змінні http / https ENV і без належної інсталяції я не можу створити образ. Тому запуск докера мені тут не допомагає.
Анікет

Я боюся, що вам доведеться створювати конкретні зображення, різниця лише в тому, що значення http_proxy (s) ONBUILD можуть допомогти, але я боюся, що це тут не підходить, див. Документ docs.docker.com/reference/builder
user2915097

Це було обговорено тут github.com/docker/docker/issues/4962 і знову тут github.com/docker/docker/pull/9176 і закрито, тому на даний момент, здається, у вас немає рішення
user2915097

Дякую користувачеві2915097 за ваші коментарі. Я вже переглядав наведені вище посилання на github, я поставив це питання з крихітною надією, що хтось із Stackoverflow міг зіткнутися з подібною ситуацією.
Анікет

Відповіді:


121

Контейнери можна будувати, використовуючи build arguments(у Docker 1.9+), які працюють як змінні середовища.

Ось метод:

FROM php:7.0-fpm
ARG APP_ENV=local
ENV APP_ENV ${APP_ENV}
RUN cd /usr/local/etc/php && ln -sf php.ini-${APP_ENV} php.ini

а потім побудуйте виробничий контейнер:

docker build --build-arg APP_ENV=prod .

Для вашої конкретної проблеми:

FROM debian
ENV http_proxy ${http_proxy}

а потім запустіть:

docker build --build-arg http_proxy=10.11.24.31 .

Зверніть увагу, що якщо ви створюєте контейнери за допомогою docker-compose, ви можете вказати ці аргументи побудови у docker-compose.ymlфайлі , але не в командному рядку. Однак ви можете використовувати заміну змінної у docker-compose.ymlфайлі, яка використовує змінні середовища .


8
Тому що я пропустив це: Вам потрібен ARG, щоб повідомити докеру, що аргумент побудови може бути переданий конструктору. Без зазначення ARG <name> це не працює.
Маркус Брукнер

4
Це ENV APP_ENV ${APP_ENV}не потрібно. Досить мати ARG APP_ENVбез, =localі він захопить аргумент побудови та використає його як будь-яку змінну, встановленуENV
ElmoVanKielmo

3
@ElmoVanKielmo Це правда під час збірки, але ARGне зберігається як змінна середовища при запуску образу докера. Використання ENV APP_ENV ${APP_ENV}гарантує, що змінна середовища все ще доступна, коли контейнер запущений.
DuckPuppy

@DuckPuppy правда, але я дотримувався питання ОП
ElmoVanKielmo

Питання @ElmoVanKielmo OP стосується переходу ENVз командного рядка, то як ARGдопомогти наявність одного? Вам потрібно, ARGщоб ви могли пропустити один, --build-argа потім вам потрібно ENVскопіювати його до змінної середовища, щоб зберегтись із зображенням.
haridsv

19

Тож мені довелося полювати на це методом спроб і помилок, оскільки багато людей пояснюють, що ви можете пройти ARG-> ENVале це не завжди працює, оскільки дуже важливо, чи визначається ARG до або після FROMтегу.

Наведений нижче приклад повинен це чітко пояснити. Спочатку моєю основною проблемою було те, що всі мої ARGS були визначені до того, FROMщо призвело до того, що всі ENVвони завжди були невизначеними.

# ARGS PRIOR TO FROM TAG ARE AVAIL ONLY TO FROM for dynamic a FROM tag
ARG NODE_VERSION
FROM node:${NODE_VERSION}-alpine

# ARGS POST FROM can bond/link args to env to make the containers environment dynamic
ARG NPM_AUTH_TOKEN
ARG EMAIL
ARG NPM_REPO

ENV NPM_AUTH_TOKEN ${NPM_AUTH_TOKEN}
ENV EMAIL ${EMAIL}
ENV NPM_REPO ${NPM_REPO}

# for good measure, what do we really have
RUN echo NPM_AUTH_TOKEN: $NPM_AUTH_TOKEN && \
  echo EMAIL: $EMAIL && \
  echo NPM_REPO: $NPM_REPO && \
  echo $HI_5
# remember to change HI_5 every build to break `docker build`'s cache if you want to debug the stdout

..... # rest of whatever you want RUN, CMD, ENTRYPOINT etc..

4
WOW, боже, трапилось і зі мною! Про це ніхто не говорить, ніде в документах не згадується, попереджається тощо! Дуже дякую!!!
chrizzler 03.03.20

Чи міг би я згадати, що це було критично важливо, якщо ваше середовище розгортання походить від автоматичного CI. Тобто я знайшов це, коли намагався зробити gitlab CI масштабованим між доменами проекту. Проект IE One, можливо, встановлює одну версію вузла тощо ...
Нік,

2

Я зіткнувся з такою ж ситуацією.

Відповідно до відповіді Sin30 гарним рішенням є використання оболонки,

CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.