用于python 3.5的pyramid应用程序的正确Dockerfile语法?

问题描述:

我想在Docker容器中运行一个金字塔应用程序,但我在Dockerfile中正确地使用了语法。金字塔没有官方的Dockerfile,但我发现这个网站建议使用Ubuntu基本映像。 https://runnable.com/docker/python/dockerize-your-pyramid-application用于python 3.5的pyramid应用程序的正确Dockerfile语法?

但是这是为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] 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

而且即使没有建立,如何结束错误的转换将执行在3.5而不是2.7?我尝试修改Dockerfile来创建一个虚拟环境来强制执行在3.5,但仍然没有运气。对于它的价值,这在我的3.5虚拟环境的机器上工作得很好。

那么,任何人都可以帮助我构建正确的Dockerfile,以便我可以使用Python 3.5运行此Pyramid应用程序?我没有结婚到Ubuntu的形象。

+1

如果你只在docker镜像中安装Python3,那么应用程序将不会运行在2.7 – jchysk

如果有帮助,这里是我们使用Docker开发的金字塔应用程序的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应用程序和工作人员使用相同的图像,所以我们必须在每次重建时重建两次。

而最后一件事,如果你对发展本地运行,像我们一样,你必须在控制台中运行

docker-compose run web python setup.py develop 

一次,否则,你会得到这样的错误,如果应用程序是不是当你docker-compose up可访问。发生这种情况是因为,当您使用代码装入卷时,会从映像中删除该卷,因此软件包文件(如.egg)被“删除”。

+0

的帮助下,谢谢!还有什么帮助解决了如何交互式地运行容器,以便我可以一行一行地调试导致问题的原因。 – Jonathan