Atlassian Bamboo Server 中 Docker 中的 Docker 权限被拒绝

Posted

技术标签:

【中文标题】Atlassian Bamboo Server 中 Docker 中的 Docker 权限被拒绝【英文标题】:Permission denied with Docker in Docker in Atlassian Bamboo Server 【发布时间】:2020-05-17 22:00:48 【问题描述】:

我正在尝试使用带有 Atlassian Bamboo 的 DIND 构建 docker 映像。

我已经按如下方式创建了部署/StatefulSet:

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: bamboo
  name: bamboo
  namespace: csf
spec:
  replicas: 1
  serviceName: bamboo
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: bamboo
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: bamboo
    spec:
      containers:
      - image: atlassian/bamboo-server:latest
        imagePullPolicy: IfNotPresent
        name: bamboo-server
        resources: 
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        securityContext:
          privileged: true
        volumeMounts:
        - name: bamboo-home
          mountPath: /var/atlassian/application-data/bamboo
        - mountPath: /opt/atlassian/bamboo/conf/server.xml
          name: bamboo-server-xml
          subPath: bamboo-server.xml
        - mountPath: /var/run 
          name: docker-sock
      volumes:
      - name: bamboo-home
        persistentVolumeClaim:
          claimName: bamboo-home
      - configMap:
          defaultMode: 511
          name: bamboo-server-xml
        name: bamboo-server-xml
      - name: docker-sock 
        hostPath: 
          path: /var/run
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: 
      terminationGracePeriodSeconds: 30

请注意,我在 securityContext 中设置了 privileged: true 以启用此功能。

但是,当我尝试运行 docker 镜像时,出现权限错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See '/var/atlassian/application-data/bamboo/appexecs/docker run --help'

我是否错过了设置 DIND 的内容?

【问题讨论】:

我有 2 个想法可能会有所帮助,第一个是将您的用户添加到 docker 组,如 here 所述。第二是使用sudo chmod 666/777 /var/run/docker.sock。让我知道这是否对您有用,或者您仍然需要帮助。 将用户添加到 docker 组是我所缺少的 @jt97 很高兴听到这个消息。我将此评论添加为更多可见性的答案。 【参考方案1】:

主机系统上的 /var/run/docker.sock 文件由与运行竹服务器容器进程的用户不同的用户拥有。

在不了解您的集群的任何详细信息的情况下,我假设 docker 以“root”身份运行 (UID=0)。竹服务器作为“竹”运行,从它的Dockerfile 可以看出,它通常会映射到主机系统上 1XXX 范围内的 UID。由于这些用户不同,并且容器进程没有收到对(主机)套接字的任何特定权限,因此会给出错误。

所以我认为有两种可能的方法:

或者容器进程继续以 'bamboo' 用户身份运行,但在主机系统上获得了足够的权限来访问 /var/run/docker.sock。这通常意味着将竹用户在主机系统上映射到的 UID 添加到主机系统上的 docker 组。但是,对主机系统进行更改可能是也可能不是一个选项,具体取决于集群的上下文,并且在集群上下文中很棘手,因为 pod 可能会迁移到未应用更改的不同节点和/或 UID变化。

或者容器被更改为作为具有足够特权的用户开始运行,即 root 用户。有两种方法可以做到这一点:1. 扩展和自定义 Atlassian 提供的基础映像以更改用户或 2. 通过“runAsUser”和“runAsGroup”securityContext 覆盖容器在运行时运行的用户指定here 的指令。两者都应该是“0”。

【讨论】:

【参考方案2】:

如文档here中所述

如果您想以非 root 用户身份运行 docker,则需要将其添加到 docker 组中。


如果 docker 组不存在,则创建它

$ sudo groupadd docker

将您的用户添加到 docker 组。

$ sudo usermod -aG docker $USER

退出并重新登录,以便重新评估您的群组成员资格。

$ newgrp docker

验证是否可以在不使用 sudo 的情况下运行 docker 命令

$ docker run hello-world

如果这没有帮助,您可以更改 docker socket 的权限,以便能够连接到 docker 守护进程 /var/run/docker.sock。

sudo chmod 666 /var/run

【讨论】:

【参考方案3】:

处理此问题的更好方法是运行 sidecar 容器 - docker:dind,然后在主 Bamboo 容器中导出 DOCKER_HOST=tcp://dind:2375。这样,您将在 dind 容器中调用 Docker,而无需挂载 /var/run/docker.sock

【讨论】:

以上是关于Atlassian Bamboo Server 中 Docker 中的 Docker 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Atlassian Bamboo 命令任务未正确运行

如何在 PowerShell 中添加 Atlassian Bamboo 变量?

RoboCopy + Atlassian Bamboo 持续集成

使用 Atlassian Bamboo 的 Android CI

ruby Atlassian Bamboo的示例serverspec测试

Jenkins 和 Atlassian Bamboo 的集成