Docker:用于“docker stack deploy”的 docker compose 文件

xar*_*tra 5 stack docker docker-compose

我有一个docker-compose.ymldocker-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
Run Code Online (Sandbox Code Playgroud)

但是当我使用时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
Run Code Online (Sandbox Code Playgroud)

任何提示我应该如何“翻译”docker-compose.yml文件以使其兼容docker stack deploy

BMi*_*tch 13

要以 swarm 模式运行容器,您不需要在每个 swarm 节点上单独构建它们。相反,您构建镜像一次,通常是在 CI 服务器上,推送到注册服务器(通常在本地托管,或者您可以使用 docker hub),并在您的撰写文件中为每个服务指定一个“镜像”部分的镜像名称。

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

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

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

在没有看到您的 Dockerfile 的情况下,我还建议在每个图像上设置健康检查。Swarm 模式使用它来控制滚动更新并从应用程序故障中恢复。

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

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