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

6
我有一个名为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兼容的格式吗?


你好,有没有关于如何正确“翻译”代码的解决方案? - keshav
1个回答

16
为了在Swarm模式下运行容器,不需要在每个Swarm节点上单独构建它们。相反,您只需在CI服务器上构建一次图像,将其推送到注册表服务器(通常是本地托管的,或者您可以使用Docker Hub),并在每个服务的compose文件中使用“image”部分指定镜像名称即可。
这样做将消除严格错误。由于它不再适用,您很可能会删除compose文件中的构建部分。
指定“container_name”不受支持,因为这会破坏缩放或执行更新的能力(容器名称必须在Docker引擎内惟一)。让Swarm命名容器并通过其服务名称引用您的应用程序在Docker网络上。
指定“depends_on”不受支持,因为容器可能在不同的节点上启动,并且滚动更新/故障恢复可能会在应用程序启动后删除提供服务的某些容器。Docker可以重试失败的应用程序,直到其他服务启动,或者最好配置一个等待依赖项变得可用的入口点,并进行一两分钟的ping操作。
如果没有看到您的Dockerfile,我还建议为每个图像设置健康检查。Swarm模式使用此功能控制滚动更新并从应用程序故障中恢复。最后,考虑向您的compose文件添加一个“deploy”部分。这会告诉swarm模式如何部署和更新您的服务,包括有多少个副本、在哪里运行限制、内存和CPU限制要求以及更新服务的速度。您也可以在此定义重启策略,但我建议不要这样做,因为我曾经看到docker引擎重启与swarm模式在其他节点部署的容器产生冲突,甚至在同一节点上部署新容器。
您可以在此处查看所有这些选项的完整compose文件文档:https://docs.docker.com/compose/compose-file/

有没有办法至少从Swarm命名约定中删除下划线?因为它会影响到Apache... - A.J Alhorr
1
@A.JAlhorr 我认为您想要打开一个新的问题来描述您想要解决的问题,而不是您想要尝试实现的解决方案。Apache 不应该知道容器名称。 - BMitch
是的,抱歉,我已经弄清楚了。在同一网络中的其他容器中,您可以通过容器名称而不是堆栈来调用它。因此,对于一个名为stack_container的容器,您可以将请求简单地发送到container而不是stack_container - A.J Alhorr
1
@A.JAlhorr 这是 service 的名称,无论是 swarm 还是 compose 都会为其创建别名,并且这是调用其他容器的首选方式。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接