我有一个jenkins管道,它在NUC服务器上构建和运行各种容器。
此NUC与另一个NUC在群集(群集)上。
我最近在我的设置和该群集上添加了几个树莓派,所以现在我想知道是否存在一种命令Jenknis在x86_x64 or armhf
设备上进行部署的方法。
我尝试了在其他问题上发现的-e constraint:node==<node_name>
解决方案,但我没有运气。
我从一个指向另一个的x86_x64
节点和指向x86_x64
的armhf
节点尝试了上述命令
我不想将那些容器作为服务运行,也不需要任何负载平衡器,我只想在特定体系结构上运行容器(x86_x64 or armhf
取决于我要部署的内容)
最佳答案
您不能仅在服务上对容器使用约束。
话虽这么说,对服务使用约束似乎是一个不错的方法。
您可以在official documentation中了解有关服务约束的更多信息。
以下是有关约束如何匹配节点或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 }}"
您的docker节点将被标记为
arch
键和以下值之一: