我正在开展一项任务,即使用 Dockerfile 构建以 centOs 为基础的泊坞窗图片。 dockerfile中的一个步骤需要设置 http_proxy 和 https_proxy ENV变量才能在代理后面工作。
由于这个Dockerfile将由具有不同代理的多个团队使用,我想避免为每个团队编辑Dockerfile。相反,我正在寻找一种解决方案,允许我在构建时传递ENV变量,例如,
sudo docker build -e http_proxy = somevalue。
我不确定是否已有提供此功能的选项。我错过了什么吗?
答案 0 :(得分:88)
容器可以使用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
构建容器,则可以specify these build-args in the docker-compose.yml
file,但不能在命令行上。但是,您可以使用variable substitution in the docker-compose.yml
file, which uses environment variables。
答案 1 :(得分:1)
我遇到了同样的情况。
根据Sin30的回答,漂亮的解决方案是使用shell,
CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]
答案 2 :(得分:0)
因此,我不得不通过反复试验来解决这个问题,因为许多人解释说,您可以通过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..