我有一个jenkins管道,它在NUC服务器上构建和运行各种容器。
此NUC与另一个NUC在群集(群集)上。
我最近在我的设置和该群集上添加了几个树莓派,所以现在我想知道是否存在一种命令Jenknis在x86_x64 or armhf设备上进行部署的方法。

我尝试了在其他问题上发现的-e constraint:node==<node_name>解决方案,但我没有运气。

我从一个指向另一个的x86_x64节点和指向x86_x64armhf节点尝试了上述命令

我不想将那些容器作为服务运行,也不需要任何负载平衡器,我只想在特定体系结构上运行容器(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键和以下值之一:
  • armhf
  • armv7l
  • i386
  • x86_64
  • 08-28 07:58
    查看更多