使用Docker开发环境时如何处理Python的requirements.txt?

Ted*_*pac 4 python flask requirements.txt docker docker-compose

假设我编写了一个docker-compose.dev.yml文件来使用 Docker 设置 Flask 项目(Web 应用程序)的开发环境。我docker-compose.dev.yml设置了两项服务,一项用于数据库,一项用于在调试模式下运行 Flask 应用程序(这允许我进行热更改,而无需重新创建/重新启动容器)。这使得开发团队中的每个人都可以非常轻松地使用相同的开发环境。然而,存在一个问题:很明显,在开发应用程序时,有必要安装库,并在文件中列出它们requirements.txt(在Python的情况下)。为此,我只看到使用 Docker 开发环境的两种替代方案:

  1. 进入运行 Flask 应用程序的容器的控制台并使用pip install ...pip freeze > requirements.txt命令。
  2. 手动将依赖项写入文件requirements.txt并重建容器。

第一个选项有点费力,而第二个选项则有点“脏”。还有比上述两种选择更合适的选择吗?

编辑:我不知道我是否在问一些没有意义的事情,但如果有人能给我一些关于我想要完成的任务的指导,我将不胜感激。

roc*_*ady 5

对于这样的事情,我使用多层泊坞窗图像。

免责声明:以下示例未经测试。请仅将其视为用伪代码编写的描述;)

作为一个非常简单的示例,这种方法可能如下所示:

# Make sure all layers are based on the same python version.
FROM python:3.10-slim-buster as base

# The actual dev/test image.
# This is where you can install additional dev/test requirements.
FROM base as test
COPY ./requirements_test.txt /code/requirements_test.txt
RUN python -m pip install --no-cache-dir --upgrade -r /code/requirements_test.txt

ENTRYPOINT ["python"]
# Assuming you run tests using pytest.
CMD ["-m", "pytest", "..."]

# The actual production image.
FROM base as runtime
COPY ./requirements.txt /code/requirements.txt
RUN python -m pip install --no-cache-dir --upgrade -r /code/requirements.txt

ENTRYPOINT ["python"]
# Assuming you wantto run main.py as a script.
CMD ["/path/to/main.py"]
Run Code Online (Sandbox Code Playgroud)

requirements.txt这样(只是一个例子):

requests
Run Code Online (Sandbox Code Playgroud)

requirements_test.txt这样(只是一个例子):

-r requirements.txt

pytest
Run Code Online (Sandbox Code Playgroud)

在您的文件中,您只需要像这样(不完整)docker-compose.yml传递--target(多层 Dockerfile,在本例中:test和):runtime

services:
  service:
    build:
      context: .
      dockerfile: ./Dockerfile
      target: runtime  # or test for running tests
Run Code Online (Sandbox Code Playgroud)

最后一个想法:正如我在评论中提到的,处理此类依赖关系需求的更好方法可能是使用像poetryor 这样的工具pip-tools- 或任何其他工具。


2022年5月23日更新

正如评论中提到的,为了完整起见,并且因为这种方法可能接近可能的解决方案(如问题中所要求的):

一劳永逸方法的示例可能如下所示 - 假设容器具有特定名称 ( <containe_name>):

# This requires to mount the file 'requirements_dev.txt' into the container - as a volume.
docker exec -it <container_name> python -m pip install --upgrade -r requirements_dev.txt
Run Code Online (Sandbox Code Playgroud)

此命令只是将新的依赖项安装到正在运行的容器中。