我们可以通过cmd行传递ENV变量,同时通过dockerfile构建一个docker映像吗?

qkf9rpyu  于 2023-01-20  发布在  Docker
关注(0)|答案(3)|浏览(152)

我正在处理的任务涉及使用Dockerfile构建以centOs为基础的Docker映像。Dockerfile中的一个步骤需要设置http_proxyhttps_proxyENV变量,以便在代理后面工作。
由于此Dockerfile将由具有不同代理的多个团队使用,我希望避免为每个团队编辑Dockerfile。相反,我正在寻找一种解决方案,允许我在构建时传递ENV变量,例如,
sudo docker构建-e http_proxy=某个值。
我不确定是否已经有这样的选项。我错过了什么吗?

9cbw7uwe

9cbw7uwe1#

容器可以使用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文件中使用变量替换,该文件使用环境变量。

2izufjch

2izufjch2#

因此,我不得不通过反复试验来寻找这个问题,因为许多人解释说,您可以传递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..
13z8s7eq

13z8s7eq3#

我也遇到过同样的情况。
根据Sin30的回答,漂亮的解决方案是使用shell,

CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]

相关问题