【问题标题】:When to run a command in docker compose and when in dockerfile?何时在 docker compose 中运行命令以及何时在 dockerfile 中运行命令?
【发布时间】:2021-09-02 20:53:31
【问题描述】:

我在某种程度上是 docker 的新手,所以请耐心等待一个可能很愚蠢的问题。

据我了解,如果我想要一个正在运行的容器而不是一个可执行文件,那么你会以一个“命令”结束它。好的。

所以,如果我想要的是一个为 django 应用程序提供服务的容器,我必须添加如下内容:

python manage.py runserver 0.0.0.0:8000

现在的问题是: 我们是否将其添加到定义图像的 dockerfile 的末尾?

或者我在使用图像的docker compose中添加这个命令,像这样?

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
[...]

【问题讨论】:

    标签: django docker docker-compose


    【解决方案1】:

    如果将某些内容放入 Dockerfile 中是有意义的,那么您应该将它放在那里(但并非所有内容都有意义)。考虑一下可以运行此容器的其他方式(docker run;将其放入 Kubernetes 清单中)以及可以运行它的类似其他环境(例如,数据库维护在不同的主机上)。如果每次运行容器时基本总是相同的,请将其放入 Dockerfile 中。

    在您提供的示例中,您正在构建的图像用于 Django 应用程序。每当您运行图像时,无论上下文如何,您可能总是想要运行 Django 应用程序,并且使用该命令行。所以放入Dockerfile

    CMD ./manage.py runserver 0.0.0.0:8000
    

    并且不要提供 Compose command:docker run 命令、Kubernetes command: 或其他部署时间设置。

    相反,您的底层数据库存储在每个环境中都会有所不同。因此,使用环境变量或其他设置指定数据库位置并将其包含在您的部署配置中是有意义的。

    # in a host development environment
    export PGHOST=localhost
    pipenv run ./manage.py runserver
    
    # docker-compose.yml
    version: '3.8'
    services:
      db:
        image: postgres
      app:
        build: .
        environment:
          - PGHOST=db # (not a Dockerfile ENV)
        ports:
          - '8000:8000'
    

    command: 的一个值得注意的例外是,如果您的图像可以做两件事。结合 Django 和 Celery 就是一个很好的例子:两个部分将共享大部分相同的代码库,因此要专门运行 Celery worker,您需要运行相同的图像但使用不同的命令。

    version: '3.8'
    services:
      redis:
        image: redis
      app:
        build: .
        environment: [REDIS_HOST=redis]
        ports: ['8000:8000']
      worker:
        build: .
        environment: [REDIS_HOST=redis]
        command: celery worker ...
    

    【讨论】:

      【解决方案2】:

      您可以创建一个 sh 文件并从 Dockerfile 触发它

      boot-strap.sh

      python manage.py runserver 0.0.0.0:8007
      

      在 Dockerfile 中:

      ...
      ENTRYPOINT ["sh",".../boot-strap.sh"]
      

      通过这种方式,您可以添加其他命令(例如,python manage.py migrate ..)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-12
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多