如何在一个目录中为一个项目拥有多个 docker 镜像?

max*_*son 5 python deployment docker dockerfile docker-compose

对于我当前的 python 项目,我想一次运行多个“程序”(例如爬虫、索引器、Web 服务器、postgresql 服务器等)。所有这些 python 程序在同一目录中共享一些公共模块。我不想为每个程序创建不同的目录,因为这需要我在不同的地方拥有这些通用模块的多个副本。我不能在每个程序的同一目录中拥有多个 dockerfile(我不认为?)。我很确定我想使用 docker-compose,但是在我从单独的 dockerfile 构建单独的图像之后。

在这种情况下我该怎么办?我很确定我的想法是错误的,因为我无法想象这是一个不常见的问题。

谢谢!

Dav*_*aze 9

在纯 Docker 领域有两个简单的答案。

您可以做的第一件事是将所有代码打包到一个图像中:

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["./main.py"]
Run Code Online (Sandbox Code Playgroud)

docker run您可以覆盖命令或文件中的命令部分docker-compose.yml,以便在同一映像上运行多个容器。

version: '3'
services:
  crawler:
    build: .
    command: ./crawl.py
  indexer:
    build: .
    command: ./indexer.py
Run Code Online (Sandbox Code Playgroud)

或者,您可以在同一目录中拥有多个 Dockerfile

version: '3'
services:
  crawler:
    build:
      context: .
      dockerfile: Dockerfile.crawler
  indexer:
    build:
      context: .
      dockerfile: Dockerfile.indexer
Run Code Online (Sandbox Code Playgroud)

这些 Dockerfile 可能会受到更多限制

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY common common
COPY crawler crawler
COPY crawler.py .
CMD ["./crawler.py"]
Run Code Online (Sandbox Code Playgroud)

使用哪种方法取决于您的代码库。如果它使用解释性语言,则几乎所有代码都是共享的,唯一真正的区别是您正在运行的命令,那么最好只使用一个图像。但是,如果每个依赖项的库依赖项显着不同,或者如果您需要为每个进程构建单独的二进制文件,则每个进程的单独映像更有意义。