我想在docker容器中运行金字塔应用程序,但我在Dockerfile中正确使用了正确的语法。金字塔没有官方的Dockerfile,但我发现这个网站推荐使用Ubuntu基础映像。 https://runnable.com/docker/python/dockerize-your-pyramid-application
但这适用于Python 2.7。我有什么想法可以改为3.5吗?这就是我试过的:
Dockerfile
FROM ubuntu:16.04
RUN apt-get update -y && \
apt-get install -y python3-pip python3-dev && \
pip3 install --upgrade pip setuptools
# We copy this file first to leverage docker cache
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip3 install -r requirements.txt
COPY . /app
ENTRYPOINT [ "python" ]
CMD [ "pserve development.ini" ]
我从命令行运行:
docker build -t testapp .
但是会产生一系列以此
结尾的错误FileNotFoundError:[Errno 2]没有这样的文件或目录:' /usr/local/lib/python3.5/dist-packages/appdirs-1.4.3.dist-info/METADATA' 命令' / bin / sh -c pip3 install -r requirements.txt'返回非零代码:2
即使确实构建了,如何在3.5而不是2.7中执行?我尝试修改Dockerfile来创建一个虚拟环境来强制执行3.5,但仍然没有运气。对于它的价值,这在我的具有3.5虚拟环境的机器上运行良好。
那么,任何人都可以帮我构建正确的Dockerfile,以便我可以使用Python 3.5运行这个Pyramid应用程序吗?我没有和Ubuntu图像结婚。
答案 0 :(得分:4)
如果这可以提供帮助,这是我使用Docker开发的Pyramid应用程序的Dockerfile。但它并没有使用Docker在生产中运行。
FROM python:3.5.2
ADD . /code
WORKDIR /code
ENV PYTHONUNBUFFERED 0
RUN echo deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main >> /etc/apt/sources.list.d/pgdg.list
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN apt-get update
RUN apt-get install -y \
gettext \
postgresql-client-9.5
RUN pip install -r requirements.txt
RUN python setup.py develop
正如您可能注意到的,我们使用Postgres和gettext,但您可以安装所需的任何依赖项。
行ENV PYTHONUNBUFFERED 0
我认为我们补充说因为Python会缓冲所有输出,所以在控制台中不会打印任何内容。
我们现在使用Python 3.5.2。我们尝试了一个版本,但我们遇到了问题。也许这已经解决了。
另外,如果这有帮助,这里是docker-compose.yml
文件的编辑版本:
version : '2'
services:
db:
image: postgres:9.5
ports:
- "15432:5432"
rabbitmq:
image: "rabbitmq:3.6.6-management"
ports:
- '15672:15672'
worker:
image: image_from_dockerfile
working_dir: /code
command: command_for_worker development.ini
env_file: .env
volumes:
- .:/code
web:
image: image_from_dockerfile
working_dir: /code
command: pserve development.ini --reload
ports:
- "6543:6543"
env_file: .env
depends_on:
- db
- rabbitmq
volumes:
- .:/code
我们通过
来构建图像docker build -t image_from_dockerfile .
而不是直接传递docker-compose.yml
配置中的Dockerfile路径,因为我们对Web应用程序和worker使用相同的图像,所以每次我们必须重建时都要重建两次。
最后一件事,如果你像我们一样在本地开展开发,你必须运行
docker-compose run web python setup.py develop
在控制台中一次,否则,您将收到错误消息,例如docker-compose up
时无法访问该应用。发生这种情况是因为当您使用其中的代码装入卷时,它将从图像中删除该卷,因此包文件(如.egg
)被“删除”。