在多阶段Docker构建中坚持ENV

时间:2018-11-29 14:34:20

标签: docker sentry

我有一个Dockerfile指定了这样的多阶段构建:

@tf.contrib.eager.defun
def func(tensors):
    y, idx = tf.unique(tensors) #, dtype=tf.int32)
    return tf.size(y)

un_3 = tf.map_fn(func, un_2, infer_shape=False)

`

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 继承的阶段具有pip命令,该命令在构建期间失败,因为pypi服务器的代理的ENV设置包含在先前的构建阶段中。有没有办法保留此ENV设置,以使sentry:9.0-onbuild中指定的命令不会失败

1 个答案:

答案 0 :(得分:2)

  

是否有一种方法可以在整个构建阶段中保持该ENV设置

不,没有。

一个选项包括一对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而傻瓜。