如何强制docker build使用devpi server for pip install命令?

时间:2014-07-30 07:44:47

标签: pip docker devpi

我正在尝试使用docker build为我的基于烧瓶的web应用程序构建一个图像。我的Dockerfile如下所示:

FROM beehive-webstack:latest
MAINTAINER Anuvrat Parashar <anuvrat@zopper.com>

EXPOSE 5000
ADD . /srv/beehive/

RUN pip install -i http://localhost:4040/root/pypi/+simple/ -r /srv/beehive/requirements.txt

没有-i标志的pip安装工作,但它从pypi下载所有内容,这自然很慢。

问题是pip无法访问笔记本电脑上运行的devpi服务器。我怎样才能实现这一目标?

2 个答案:

答案 0 :(得分:4)

一个答案是devpi辅助容器。启动docker devpi映像并使其显示端口3141.然后,您可以使用docker文件中的环境变量将其添加为pip install的额外源。

使用docker compose启动devpi:

devpi:
  image: scrapinghub/devpi
  container_name: devpi
  expose:
      - 3141
  volumes:
      - /path/to/devpi:/var/lib/devpi

myapp:
  build: .
  external_links:
   - devpi:devpi

docker-compose up -d devpi

现在您需要配置客户端docker容器。它需要配置pip:

在您的Dockerfile中:     ENV PIP_EXTRA_INDEX_URL = http://devpi:3141/root/pypi/+simple/ \         PIP_TRUSTED_HOST = devpi

登录您的容器检查它是否正常工作:

docker-compose run myapp bash

pip install --verbose nose

输出应包括

  2 location(s) to search for versions of nose:
  * https://pypi.python.org/simple/nose/
  * http://devpi:3141/root/pypi/+simple/nose/

现在,您可以将包从另一个容器或sftp上传到您的容器。

这种方法具有加速构建的优点,但如果不存在devpi容器则不会破坏它们。

注意:如果没有强密码,请不要将端口发布到devpi,因为这是一个安全问题。人们可以使用它来上传应用程序将安装和执行的任意代码。

答案 1 :(得分:2)

localhost指的是docker容器,而不是指向您的主机,因为RUN行只是容器中执行的命令。因此,您必须使用笔记本电脑的网络可达IP。

Con:如果其他人没有运行pypi镜像,这会使您的Dockerfile无法移植。