在多阶段 docker 构建中保留 ENV

sha*_*war 2 sentry docker

我有一个指定多阶段构建的 Dockerfile,如下所示:

FROM python:2.7.15-slim-jessie
RUN pip install devpi-client --index https://pypi.org/simple --proxy=myproxy.com
RUN devpi use http://proxyip/root/internal --set-cfg
ENV HTTP_PROXY="http://myproxy.com"
ENV HTTPS_PROXY="http://myproxy.com"


FROM sentry:9.0-onbuild

RUN apt-get -qq update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q libxslt1-dev libxml2-dev libpq-dev libldap2-dev libsasl2-dev libssl-dev

COPY sentry.conf.py /etc/sentry/sentry.conf.py

COPY requirements.txt /tmp/

RUN pip install -r /tmp/requirements.txt

# cleanup
RUN apt-get remove -y -q libxslt1-dev libxml2-dev libpq-dev libldap2-dev libsasl2-dev libssl-dev
RUN rm -rf /var/lib/apt/lists/*
RUN rm /tmp/requirements.txt
Run Code Online (Sandbox Code Playgroud)

`

继承的阶段sentry:9.0-onbuild具有在构建期间失败的 pip 命令,因为 pypi 服务器的代理的 ENV 设置包含在前一个构建阶段中。有没有办法保留此 ENV 设置,以便中指定的命令不会sentry:9.0-onbuild失败

blu*_*res 5

有没有办法[跨构建阶段]保留此 ENV 设置

不,没有。

一个选项包括一对ARG

ARG HTTP_PROXY=http://myproxy.com
ENV $HTTP_PROXY

ARG HTTPS_PROXY=https://myproxy.com
ENV $HTTPS_PROXY
Run Code Online (Sandbox Code Playgroud)

在每个阶段。不是很优雅,但它可以让你--build-arg HTTP_PROXY=http://whatever.com在命令行上传递一次等,并且它会为所有阶段设置。


另一种可能性是,您可以从主机复制一个定义了这些值的文件:

# proxy.env
HTTP_PROXY=http://myproxy.com
HTTPS_PROXY=https://myproxy.com
Run Code Online (Sandbox Code Playgroud)

并且只是source根据每个阶段的需要:

FROM sentry:9.0-onbuild
RUN source proxy.env && apt-get -qq update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q libxslt1-dev libxml2-dev libpq-dev libldap2-dev libsasl2-dev libssl-dev
Run Code Online (Sandbox Code Playgroud)

也有点难看,但至少你可以通过在某个地方定义一次来保持值的一致,文件将在 VCS 中,并且你不必愚弄通过--build-arg每个构建。