对于我当前的python项目,我想一次运行多个“程序”(例如,搜寻器,索引器,Web服务器,postgresql服务器等)。 所有这些python程序在同一目录中共享一些通用模块。我不想为每个程序创建不同的目录,因为这将要求我在不同位置具有这些通用模块的多个副本。对于每个程序,我不能在同一目录中有多个dockerfile(我不认为吗?)。我很确定我想使用docker-compose,但是在我从单独的dockerfiles构建了单独的映像之后。
在这种情况下我该怎么办?我敢肯定,我想的都是错的,因为我无法想象这是一个罕见的问题。
谢谢!
答案 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
构建映像并运行容器。