如何强制docker构build使用devip服务器的pip安装命令?

我正在尝试使用docker build构build基于Web的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下载一切,自然是慢的。

问题是,点不能访问我的笔记本电脑上运行的devpi服务器。 我该怎么去实现呢?

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

Con:如果其他人没有运行pypi镜像,这使得你的Dockerfile不可移植。

一个答案是一个devpi助手容器。 你启动docker的devpi镜像并让它暴露3141端口。然后你可以在docker文件中添加这个作为额外的pip安装源代码。

使用docker启动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

现在您需要configuration客户端泊坞窗容器。 它需要configurationpip:

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

通过login到你的容器检查它的工作:

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上传到您的容器。

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

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