在dockerfile中自定义ONBUILD环境

时间:2016-07-04 09:16:11

标签: python docker dockerfile

我稍微修改this Dockerfile以支持我的特定用例:我需要指定我自己的PyPi服务器,我们在那里发布我们的内部库。这通常可以通过指定pip.conf文件或将命令行选项传递给pip来实现。

我正在尝试这个:

FROM python:3.5

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD COPY requirements.txt /usr/src/app/

# 1st try: set the env variable and use it implicitely. Does not work!
# ENV PIP_CONFIG_FILE pip.conf
# ONBUILD RUN pip install --no-cache-dir -r requirements.txt

# 2nd try: set once the env variable, just for this command. Does not work!
# ONBUILD RUN PIP_CONFIG_FILE=pip.conf pip install --no-cache-dir -r requirements.txt

# 3rd try: directly configure pip. Works, but these values should not be set in the Dockerfile!
ONBUILD RUN pip install --index-url http://xx.xx.xx.xx:yyyyy --trusted-host xx.xx.xx.xx --no-cache-dir -r requirements.txt

ONBUILD COPY . /usr/src/app

我的pip.conf非常简单,在Docker之外使用时可以使用:

[global]
timeout = 60
index-url = http://xx.xx.xx.xx:yyyyy
trusted-host = xx.xx.xx.xx

链接:

  • Dockerfile的ENV记录在案here
  • pip配置已记录在案here

我有以下问题:

  • 为什么ENV无效?
  • 为什么在RUN命令中显式设置变量不起作用?
  • 这些问题是ONBUILD,还是RUN

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我设法解决了这个问题,将其添加到Dockerfile中:

COPY pip.conf pip.conf
ENV PIP_CONFIG_FILE pip.conf
RUN pip install <my_package_name>

pip.conf文件具有以下结构:

[global]
timeout = 60
index-url = https://pypi.org/simple
trusted-host = pypi.org
               <my_server_page>
extra-index-url = https://xxxx:yyyy@<my_server_page>:<package_location>

这是我为Docker找到的唯一从pypi服务器中找到软件包的方法。我希望这种解决方案是通用的,并且可以帮助其他有此问题的人。

答案 1 :(得分:1)

ONBUILD instruction向图像添加了一个触发指令,该指令将在以后执行,此时图像被用作另一个版本的基础。

From the doc

  

在1.4之前,ONBUILD指令不支持环境变量,即使与上面列出的任何指令结合使用也是如此。

使用docker 1.4+,尝试(如issue 15025中所示)

ONBUILD ENV PIP_CONFIG_FILE pip.conf