我们可以通过dockerfile构建docker镜像时通过cmd行传递ENV变量吗?

时间:2015-07-03 05:01:55

标签: docker environment-variables boot2docker dockerfile

我正在开展一项任务,即使用 Dockerfile 构建以 centOs 为基础的泊坞窗图片。 dockerfile中的一个步骤需要设置 http_proxy https_proxy ENV变量才能在代理后面工作。

由于这个Dockerfile将由具有不同代理的多个团队使用,我想避免为每个团队编辑Dockerfile。相反,我正在寻找一种解决方案,允许我在构建时传递ENV变量,例如,

  

sudo docker build -e http_proxy = somevalue。

我不确定是否已有提供此功能的选项。我错过了什么吗?

3 个答案:

答案 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..