python-3.x - 用于 Python 3.5 的 Pyramid 应用程序的正确 Dockerfile 语法?

标签 python-3.x ubuntu dockerfile pyramid

我想在 docker 容器中运行一个 Pyramid 应用程序,但我在 Dockerfile 中为正确的语法而苦苦挣扎。 Pyramid 没有官方的 Dockerfile,但我发现这个网站推荐使用 Ubuntu 基础镜像。
https://runnable.com/docker/python/dockerize-your-pyramid-application

但这是针对 Python 2.7 的。有什么想法可以将其更改为 3.5 吗?这是我尝试过的:

DockerfileFROM ubuntu:16.04RUN 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 cacheCOPY ./requirements.txt /app/requirements.txtWORKDIR /appRUN pip3 install -r requirements.txtCOPY . /appENTRYPOINT [ "python" ]CMD [ "pserve development.ini" ]
我从命令行运行它:docker build -t testapp .
但这会产生大量以此结尾的错误

FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.5/dist-packages/appdirs-1.4.3.dist-info/METADATA' The command '/bin/sh -c pip3 install -r requirements.txt' returned a non-zero code: 2



即使确实构建了,pserve 将如何在 3.5 而不是 2.7 中执行?我尝试修改 Dockerfile 以创建一个虚拟环境以强制在 3.5 中执行,但仍然没有运气。对于它的值(value),这在我的具有 3.5 虚拟环境的机器上运行良好。

那么,任何人都可以帮助我构建正确的 Dockerfile,以便我可以使用 Python 3.5 运行这个 Pyramid 应用程序吗?我没有嫁给 Ubuntu 镜像。

最佳答案

如果这有帮助,这是我使用 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 路径config,因为我们为 web 应用程序和 worker 使用相同的图像,所以我们每次必须重建时都必须重建两次。
最后一件事,如果你像我们一样在本地运行进行开发,你必须运行
docker-compose run web python setup.py develop
在控制台中一次,否则,您将收到一个错误,例如当您 docker-compose up 时无法访问该应用程序.发生这种情况是因为当您挂载包含代码的卷时,它会从镜像中删除该卷,因此包文件(如 .egg )被“删除”。
更新
而不是运行 docker-compose run web python setup.py develop生成.egg在本地,你可以告诉 Docker 使用 .egg通过在卷中包含目录来从镜像中提取目录。
例如。
    volumes:
      - .:/code
      - /code/packagename.egg-info

关于python-3.x - 用于 Python 3.5 的 Pyramid 应用程序的正确 Dockerfile 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663469/

相关文章:

python - 如何按照 python 中 matplotlib 中收到的顺序对条形进行排序?

bash - 编写可以访问用户数据的 Cron 作业

ubuntu - 如何获取支持给定平台的所有 ansible 的列表,例如Ubuntu?

mysql - 在容器启动时启动服务

Docker-compose:尝试运行 mongo 镜像时出错

python-3.x - python : verify that each array item is in array of dictionaries

python - 如何在不使用\n的情况下使用python在文本文件中添加新行

php - 在ubuntu上部署laravel 5,得到白页

json - 复制 package.json - Dockerfile

python - _tkinter.TclError : couldn't open "sample.gif": no such file or directory