4

我正在尝试使用 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 install 有效,但它从 pypi 下载所有内容,这自然很慢。

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

4

2 回答 2

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,因为这是一个安全问题。人们可以使用它来上传您的应用程序将安装和执行的任意代码。

于 2015-12-23T22:39:54.817 回答
3

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

缺点:如果其他人没有运行 pypi 镜像,这会使您的 Dockerfile 不可移植。

于 2014-07-30T11:37:20.823 回答