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

时间:2017-03-08 05:12:30

标签: python-3.x ubuntu dockerfile pyramid

我想在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图像结婚。

1 个答案:

答案 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)被“删除”。