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

时间:2020-01-25 23:04:35

标签: python docker deployment docker-compose dockerfile

对于我当前的python项目,我想一次运行多个“程序”(例如,搜寻器,索引器,Web服务器,postgresql服务器等)。 所有这些python程序在同一目录中共享一些通用模块。我不想为每个程序创建不同的目录,因为这将要求我在不同位置具有这些通用模块的多个副本。对于每个程序,我不能在同一目录中有多个dockerfile(我不认为吗?)。我很确定我想使用docker-compose,但是在我从单独的dockerfiles构建了单独的映像之后。

在这种情况下我该怎么办?我敢肯定,我想的都是错的,因为我无法想象这是一个罕见的问题。

谢谢!

2 个答案:

答案 0 :(得分:3)

在纯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

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

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

答案 1 :(得分:0)

在这种情况下,您可以使用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构建映像并运行容器。