在多阶段 docker 构建中坚持 ENV
Persist ENV in multi stage docker build
我有一个 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
`
从 sentry:9.0-onbuild
继承的阶段有 pip 命令在构建过程中失败,因为 pypi 服务器代理的 ENV 设置包含在前一个构建阶段。有没有办法保留此 ENV 设置,以便 sentry:9.0-onbuild
中指定的命令不会失败
Is there a way to persist this ENV setting [across build stages]
没有,没有。
一个选项将包含一对 ARG
:
ARG HTTP_PROXY=http://myproxy.com
ENV $HTTP_PROXY
ARG HTTPS_PROXY=https://myproxy.com
ENV $HTTPS_PROXY
在每个阶段。不是很优雅,但它会让你在命令行上传递 --build-arg HTTP_PROXY=http://whatever.com
等,只需一次,它会为所有阶段设置。
另一种可能性,您可以从您的主机复制一个定义了这些值的文件:
# proxy.env
HTTP_PROXY=http://myproxy.com
HTTPS_PROXY=https://myproxy.com
并且只是 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
也有点难看,但至少你可以通过在某个地方定义一次来保持值的一致性,文件将在 VCS 中,你不必在每次构建时都通过 --build-arg
来愚弄。
我有一个 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
`
从 sentry:9.0-onbuild
继承的阶段有 pip 命令在构建过程中失败,因为 pypi 服务器代理的 ENV 设置包含在前一个构建阶段。有没有办法保留此 ENV 设置,以便 sentry:9.0-onbuild
中指定的命令不会失败
Is there a way to persist this ENV setting [across build stages]
没有,没有。
一个选项将包含一对 ARG
:
ARG HTTP_PROXY=http://myproxy.com
ENV $HTTP_PROXY
ARG HTTPS_PROXY=https://myproxy.com
ENV $HTTPS_PROXY
在每个阶段。不是很优雅,但它会让你在命令行上传递 --build-arg HTTP_PROXY=http://whatever.com
等,只需一次,它会为所有阶段设置。
另一种可能性,您可以从您的主机复制一个定义了这些值的文件:
# proxy.env
HTTP_PROXY=http://myproxy.com
HTTPS_PROXY=https://myproxy.com
并且只是 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
也有点难看,但至少你可以通过在某个地方定义一次来保持值的一致性,文件将在 VCS 中,你不必在每次构建时都通过 --build-arg
来愚弄。