Docker 撰写安装requirements.txt

Rob*_*her 12 python git docker docker-compose

在我的 docker 镜像中,我克隆了 git master 分支来检索代码。我在开发环境中使用 docker-compose 并使用卷运行我的容器。从我的 python requirements.txt 文件安装新项目需求时遇到了一个问题。在开发环境中,它永远不会在开发环境中安装新的需求,因为在重新构建镜像时,最新的代码是从 github 中拉取的。

下面是我的 dockerfile 的一个例子:

FROM base

# Clone application
RUN git clone repo-url
# Install application requirements
RUN pip3 install -r app/requirements.txt

# ....
Run Code Online (Sandbox Code Playgroud)

这是我的撰写文件:

myapp:
    image: development
    env_file: .env
    ports:
        - "8000:80"
    volumes:
        - .:/home/app

    command: python3 manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

有没有办法在开发后安装新添加的需求?

Ale*_*una 11

我解决这个问题的方法是运行两个服务:

  1. 服务器:运行服务器取决于要求
  2. 要求:在运行服务器之前安装要求

这就是 docker-compose.yml 文件的样子:

version: '3'

services:
  django:
    image: python:3.7-alpine
    volumes:
     - pip37:/usr/local/lib/python3.7/site-packages
     - .:/project
    ports: 
      - 8000:8000
    working_dir: /project
    command: python manage.py runserver
    depends_on:
      - requirements

  requirements:
    image: python:3.7-alpine
    volumes:
      - pip37:/usr/local/lib/python3.7/site-packages
      - .:/project
    working_dir: /project
    command: pip install -r requirements.txt

volumes:
  pip37:
    external: true
Run Code Online (Sandbox Code Playgroud)

PS:我为 pip 模块创建了一个命名卷,以便我可以在不同的项目中保留它们。您可以通过运行自己创建一个:

docker volume create mypipivolume
Run Code Online (Sandbox Code Playgroud)


Dan*_*owe 8

有两种方法可以做到这一点。

用手

您可以进入容器并自行完成。缺点:不自动化。

$ docker-compose exec myapp bash
2912d2cd9eab# pip3 install -r /home/app/requirements.txt
Run Code Online (Sandbox Code Playgroud)

使用入口点脚本

您可以使用运行准备工作的入口点脚本,然后运行命令。

Dockerfile:

COPY entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh

# ... probably other stuff in here ...

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

入口点.sh:

#!/bin/sh

cd /home/app
pip3 install -r requirements.txt

# May as well do this too, while we're here.
python3 manage.py migrate

exec "$@"
Run Code Online (Sandbox Code Playgroud)

入口点在容器启动时像这样运行:

/entrypoint.sh $CMD
Run Code Online (Sandbox Code Playgroud)

其中扩展为:

/entrypoint.sh python3 manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

首先运行准备工作,然后在入口点脚本的末尾,执行传入的参数。这是您的命令,因此 entrypoint.sh 退出并由您的 Django 应用服务器替换。

更新:

在评论聊天后,发现使用exec运行命令很重要,而不是像这样在入口点脚本的末尾运行它:

python3 manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

我不记得为什么它很重要,但我以前也遇到过这个问题。您需要执行该命令,否则它将无法正常工作。