Вы не можете использовать ограничения для контейнеров, только для сервисов.
Это, как говорится, использование ограничений на услуги, кажется, хороший путь.
Вы можете узнать больше об ограничениях услуг в официальной документации .
Вот несколько примеров того, как ограничения могут соответствовать меткам узлов или Docker Engine:
# Node ID
node.id==2ivku8v2gvtg4
# Node hostname
node.hostname!=node-2
# Node role
node.role==manager
# Node labels
node.labels.security==high
# Docker Engine's labels
engine.labels.operatingsystem==ubuntu 14.04
Если вы хотите соответствовать определенному имени хоста, вам нужно использовать node.hostname==<hostname>
, а не node==<hostname>
Вы также захотите обновить ключ restart_policy
из определения политики deploy
, чтобы предотвратить запуск нового контейнера после успешного завершения первого из них.
Чтобы обернуть все это вместе, нужно что-то вроде этого:
version: "3.7"
services:
myapp:
image: <my_image>
deploy:
placement:
constraints:
- node.labels.arch == x86_64
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
Конечно, вы можете добавить метки к каждому узлу Swarm. Ansible и его модуль docker-node действительно хорошо подходят для этой цели. Вот пример пьесы:
- hosts: swarm
tasks:
- name: Add label to node specifying architecture
docker_node:
hostname: "{{ inventory_hostname }}"
labels:
arch: "{{ ansible_architecture }}"
Ваши докеры будут помечены ключом arch
и одним из следующих значений: