我有一个cli应用程序,它可以根据输入参数运行两个服务。
1- app serve // to run a web server
2- app work // to run a long-running background worker
它们共享相同的代码。部署时需要什么?
A: two separate containers or
B: two processes in the same container
什么是docker-compose配置?
答案 0 :(得分:1)
经过一番谷歌搜索后,我发现正如@sauerburger在评论中所说,每个容器最好有一个进程。
但是要有多个容器以特定的参数运行我的主应用程序(例如,一个用于主应用程序,一个用于工作程序),我需要有多个Dockerfile。在我的docker-compose中,我可以分别引用它们。
但是如何为一个项目使用不同的dockerfile?
首选解决方案是拥有一个docker目录,其中每个部分都有自己的文件夹。对于我的应用程序,它将是这样的:
- docker
- web
-Dockerfile
- worker
-Dockerfile
然后在每个Dockerfile中,我都有一个公共入口点和一个不同的cmd:
-in web Dockerfile :
- ENTRYPOINT ["/path_to_my_app/myapp"]
- CMD ["web"]
-in worker Dockerfile :
- ENTRYPOINT ["/path_to_my_app/myapp"]
- CMD ["worker"]
这样做后,我的docker-compose文件将像这样引用它们:
version: '3'
services:
web:
# will build ./docker/web/Dockerfile
build: ./docker/web
ports:
- "8090:8090"
worker:
# will build ./docker/worker/Dockerfile
build: ./docker/worker
ports:
- "8091:8091"
答案 1 :(得分:1)
如果您希望每个容器有一个进程,我建议您有一个通用映像(和Dockerfile),可以作为工作程序或服务器运行。
Dockerfile文件应将入口设置为应用程序,例如ENTRYPOINT ["/path_to_my_app/myapp"]
,而不是CMD
。当用户从命令行调用命令时,他可以使用docker run IMAGENAME work
启动工作程序,或者使用docker run IMAGENAME serve
启动服务器。
要在撰写文件中定义这两个服务,您需要为每个服务覆盖command
字段。
version: '3'
services:
web:
build: ./docker # common Dockerfile
image: IMAGENAME
ports:
- "8090:8090"
command: ["serve"]
worker:
build: ./docker # common Dockerfile
image: IMAGENAME # reuse image
ports:
- "8091:8091"
command: ["work"]
与具有两个单独图像的解决方案相比,此解决方案的优势在于可维护性的提高。由于只有一个Dockerfile和一个映像,因此这两个服务应始终兼容。