docker为一个具有不同参数的图像的多个实例撰写配置

时间:2018-10-23 08:32:29

标签: docker docker-compose

我有一个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配置?

2 个答案:

答案 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和一个映像,因此这两个服务应始终兼容。