docker 使用不同参数为一个图像的多个实例编写配置

Meh*_*hdi 2 docker docker-compose

我有一个 cli 应用程序,可以根据输入参数运行两个服务。

1- app serve // to run a web server
2- app work  // to run a long-running background worker
Run Code Online (Sandbox Code Playgroud)

他们共享相同的代码。部署时我需要什么?

 A: two separate containers or
 B: two processes in the same container 
Run Code Online (Sandbox Code Playgroud)

docker-compose 配置是什么?

sau*_*ger 5

如果您希望每个容器有一个进程,我建议使用一个通用映像(和 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"]
Run Code Online (Sandbox Code Playgroud)

与具有两个独立映像的解决方案相比,该解决方案的优势在于可维护性的提高。由于只有一个 Dockerfile 和一个镜像,因此两种服务应该始终兼容。