更正用于 Python 3.5 的金字塔应用程序的 Dockerfile 语法?
Correct Dockerfile syntax for pyramid app for use with Python 3.5?
我想在 docker 容器中 运行 一个金字塔应用程序,但我正在为 Dockerfile 中的正确语法而苦苦挣扎。 Pyramid 没有官方的 Dockerfile,但我发现这个网站推荐使用 Ubuntu 基础镜像。
https://runnable.com/docker/python/dockerize-your-pyramid-application
但这是针对 Python 2.7 的。有什么想法可以将其更改为 3.5 吗?这是我试过的:
Docker 文件
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] 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 中执行,但仍然没有运气。对于它的价值,这在我的机器上使用 3.5 虚拟环境工作得很好。
那么,任何人都可以帮助我构建合适的 Dockerfile,以便我可以 运行 使用 Python 3.5 的这个 Pyramid 应用程序吗?我没有嫁给 Ubuntu 图片。
如果这有帮助,这是我使用 Docker 开发的 Pyramid 应用程序的 Docker 文件。它不是 运行ning 在生产中使用 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
配置中传递 Docker 文件路径,因为我们为 Web 应用程序和工作程序使用相同的图像,所以每次我们都必须重建两次必须重建。
最后一件事,如果您像我们一样 运行 在本地进行开发,则必须 运行
docker-compose run web python setup.py develop
在控制台中一次,否则,您会收到一个错误,就像您 docker-compose up
时无法访问该应用程序一样。发生这种情况是因为当您使用其中的代码安装卷时,它会从图像中删除一个,因此包文件(如 .egg
)被“删除”。
更新
而不是 运行ning docker-compose run web python setup.py develop
在本地生成 .egg
,您可以告诉 Docker 使用图像中的 .egg
目录,方法是包含卷中的目录。
例如
volumes:
- .:/code
- /code/packagename.egg-info
我想在 docker 容器中 运行 一个金字塔应用程序,但我正在为 Dockerfile 中的正确语法而苦苦挣扎。 Pyramid 没有官方的 Dockerfile,但我发现这个网站推荐使用 Ubuntu 基础镜像。 https://runnable.com/docker/python/dockerize-your-pyramid-application
但这是针对 Python 2.7 的。有什么想法可以将其更改为 3.5 吗?这是我试过的:
Docker 文件
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] 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 中执行,但仍然没有运气。对于它的价值,这在我的机器上使用 3.5 虚拟环境工作得很好。
那么,任何人都可以帮助我构建合适的 Dockerfile,以便我可以 运行 使用 Python 3.5 的这个 Pyramid 应用程序吗?我没有嫁给 Ubuntu 图片。
如果这有帮助,这是我使用 Docker 开发的 Pyramid 应用程序的 Docker 文件。它不是 运行ning 在生产中使用 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
配置中传递 Docker 文件路径,因为我们为 Web 应用程序和工作程序使用相同的图像,所以每次我们都必须重建两次必须重建。
最后一件事,如果您像我们一样 运行 在本地进行开发,则必须 运行
docker-compose run web python setup.py develop
在控制台中一次,否则,您会收到一个错误,就像您 docker-compose up
时无法访问该应用程序一样。发生这种情况是因为当您使用其中的代码安装卷时,它会从图像中删除一个,因此包文件(如 .egg
)被“删除”。
更新
而不是 运行ning docker-compose run web python setup.py develop
在本地生成 .egg
,您可以告诉 Docker 使用图像中的 .egg
目录,方法是包含卷中的目录。
例如
volumes:
- .:/code
- /code/packagename.egg-info