docker为“ docker stack deploy”撰写文件

时间:2018-07-21 08:39:13

标签: docker stack docker-compose

我有一个docker-compose.yml文件,可以与docker-compose up --build一起使用。我的应用程序正常运行,一切都很好。

version: '3'

services:

  myapp:
    container_name: myapp
    restart: always
    build: ./myapp
    ports:
      - "8000:8000"
    command: /usr/local/bin/gunicorn -w 2 -b :8000 flaskplot:app

  nginx:
    container_name: nginx
    restart: always
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - myapp

但是当我使用docker stack deploy -c docker-compose.yml myapp时,出现以下错误:

Ignoring unsupported options: build, restart

Ignoring deprecated options:

container_name: Setting the container name is not supported.

Creating network myapp_default
Creating service myapp_myapp
failed to create service myapp_myapp: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided

有什么暗示我应该如何“翻译” docker-compose.yml文件以使其与docker stack deploy兼容?

1 个答案:

答案 0 :(得分:2)

要以群集模式运行容器,请不要在每个群集节点上分别构建它们。取而代之的是,通常在CI服务器上构建一次映像,然后将其推送到注册表服务器(通常是本地托管,或者可以使用docker hub),然后在撰写文件中为每个服务使用“ image”部分指定映像名称。

这样做将消除硬错误。您可能会删除撰写文件的构建部分,因为它不再适用。

不支持指定“ container_name”,因为这会破坏扩展或执行更新的能力(容器名称在docker引擎中必须唯一)。让swarm为容器命名,并通过服务名称在docker网络上引用您的应用。

不支持指定“ depends_on”,因为容器可能在不同的节点上启动,并且滚动更新/故障恢复可能会在应用程序启动后删除一些提供服务的容器。 Docker可以重试失败的应用程序,直到其他服务启动为止,或者您最好配置一个入口点,以某种方式通过一两次ping来等待依赖项变得可用。

在没有看到您的Dockerfile的情况下,我还建议您在每个映像上进行运行状况检查。 Swarm模式用于控制滚动更新并从应用程序故障中恢复。

最后,请考虑在撰写文件中添加一个“部署”部分。这告诉群模式如何部署和更新服务,包括多少副本,运行位置的限制,内存和CPU的限制和要求以及更新服务的速度。您也可以在此处定义重新启动策略,但我建议您不要这样做,因为我已经看到docker引擎重新启动与群集模式冲突的容器,从而在其他节点上部署了容器,甚至在同一节点上也部署了新容器。

您可以在此处查看包含所有这些选项的完整撰写文件文档:https://docs.docker.com/compose/compose-file/