我有一个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
兼容?
答案 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/