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

Ani*_*eth 60 environment-variables docker boot2docker dockerfile

我正在开展一项任务,涉及使用Dockerfile构建一个以centOs为基础的docker镜像.dockerfile中的一个步骤需要设置http_proxyhttps_proxy ENV变量才能在代理后面工作.

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

sudo docker build -e http_proxy = somevalue.

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

小智 98

容器可以使用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
Run Code Online (Sandbox Code Playgroud)

然后构建一个生产容器:

docker build --build-arg APP_ENV=prod .

对于您的特定问题:

FROM debian
ENV http_proxy ${http_proxy}
Run Code Online (Sandbox Code Playgroud)

然后运行:

docker build --build-arg http_proxy=10.11.24.31 .

请注意,如果使用with构建容器docker-compose,则可以docker-compose.yml文件中指定这些build-args,但不能在命令行中指定.但是,您可以docker-compose.yml文件中使用变量替换,该文件使用环境变量.

  • 因为我忽略了它:你需要ARG告诉docker可以将构建参数传递给构建器.没有指定ARG <name>它不起作用. (7认同)
  • 不需要这个'ENV APP_ENV $ {APP_ENV}`.没有`= local`就足够了`ARG APP_ENV`它将获取构建参数并将其用作`ENV`设置的任何变量 (4认同)
  • @ElmoVanKielmo在构建期间是正确的,但是在运行docker映像时,`ARG`不会作为环境变量保留。使用`ENV APP_ENV $ {APP_ENV}`可以确保在容器运行时环境变量仍然可用。 (2认同)

Nic*_*ick 28

所以我不得不通过反复试验来解决这个问题,因为很多人解释说你可以通过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..
Run Code Online (Sandbox Code Playgroud)

  • 哇,天哪,我也遇到了!没有人谈论这一点,文档中没有提及、警告等!多谢!!! (5认同)
  • 我认为这实际上[此处](https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact)进行了解释:`在 FROM 之前声明的 ARG 位于构建阶段,因此不能在 FROM` 之后的任何指令中使用 (3认同)

Tug*_*rul 5

我也面临着同样的情况。

根据 Sin30 的回答,漂亮的解决方案是使用 shell,

CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]
Run Code Online (Sandbox Code Playgroud)