如何在一个目录中为一个项目创建多个docker映像?

2024-04-26 14:54:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

谢谢


Tags: 模块文件项目composedocker图像dockerfile程序
2条回答

在纯Docker空间中有两个简单的答案

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

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["./main.py"]

您可以在docker run命令或docker-compose.yml文件中重写命令部分,以便从同一映像运行多个容器

version: '3'
services:
  crawler:
    build: .
    command: ./crawl.py
  indexer:
    build: .
    command: ./indexer.py

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

version: '3'
services:
  crawler:
    build:
      context: .
      dockerfile: Dockerfile.crawler
  indexer:
    build:
      context: .
      dockerfile: Dockerfile.indexer

而那些Dockerfiles文件可能会更加有限

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"]

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

在此场景中可以使用docker compose。假设您希望在节点应用程序的情况下运行两个容器测试并启动

docker-compose.yml

version : 3

services:
  runApp:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      -"3000:3000"
  testApp: 
    build: 
      context: .
      dockerfile: Dockerfile.dev
    command: ["npm","run","test"]    

Dockerfile.dev

FROM node:alpine

WORKDIR "/webapp"
COPY ./package.json .
RUN npm install
COPY ./ ./

CMD ["npm","run","start"]

使用docker-compose up构建映像并运行容器

相关问题 更多 >