我正在尝试使用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服务器。我怎样才能实现这一目标?
答案 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无法移植。