用于 Python 3.5 的金字塔应用程序的 Dockerfile 语法是否正确?

Jon*_*han 1 ubuntu python-3.x pyramid dockerfile

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

但这适用于 Python 2.7。任何想法如何将其更改为 3.5?这是我尝试过的:

文件
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

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

那么,谁能帮我构建正确的 Dockerfile 以便我可以使用 Python 3.5 运行这个 Pyramid 应用程序?我没有嫁给 Ubuntu 图像。

Ant*_*air 6

如果这有帮助,这里是我们使用 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
Run Code Online (Sandbox Code Playgroud)

您可能会注意到,我们使用 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
Run Code Online (Sandbox Code Playgroud)

我们通过做来建立形象

docker build -t image_from_dockerfile .
Run Code Online (Sandbox Code Playgroud)

而不是在docker-compose.yml配置中直接传递 Dockerfile 路径,因为我们对 Web 应用程序和工作程序使用相同的图像,所以每次必须重建时我们都必须重建两次。

最后一件事,如果你像我们一样在本地运行进行开发,你必须运行

docker-compose run web python setup.py develop
Run Code Online (Sandbox Code Playgroud)

在控制台中一次,否则,您会收到一个错误,例如当您docker-compose up. 发生这种情况是因为当您安装包含代码的卷时,它会从映像中删除该卷,因此包文件(如.egg)被“删除”。

更新

您可以通过将目录包含在卷中来告诉 Docker 使用映像中的目录,而不是运行docker-compose run web python setup.py develop以在.egg本地生成.egg

例如

    volumes:
      - .:/code
      - /code/packagename.egg-info
Run Code Online (Sandbox Code Playgroud)