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

Permission denied with Docker in Docker in Atlassian Bamboo Server

我正在尝试使用 DIND 和 Atlassian Bamboo 构建 docker 图像。

我创建了 deployment/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 时是否遗漏了什么?

如文档中所述here

如果您想 运行 docker 作为非根用户,那么您需要将其添加到 docker 组。


如果docker组不存在则创建

$ sudo groupadd docker

将您的用户添加到 docker 组。

$ sudo usermod -aG docker $USER

注销并重新登录,以便重新评估您的组成员资格。

$ newgrp docker

验证您可以 运行 docker 命令而无需 sudo

$ docker run hello-world

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

sudo chmod 666 /var/run

主机系统上的 /var/run/docker.sock 文件的所有者与 运行正在使用 bamboo-server 容器进程的用户不同。

在不知道有关集群的任何详细信息的情况下,我假设 docker 运行s 为 'root' (UID=0)。 bamboo-server 运行s 为 'bamboo',从它的 Dockerfile 可以看出,它通常会映射到主机系统上 1XXX 范围内的 UID。由于这些用户不同,并且容器进程未通过(主机)套接字获得任何特定权限,因此出现错误。

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

  • 或者容器进程继续 运行 作为 'bamboo' 用户,但在主机系统上被授予足够的权限来访问 /var/run/docker.sock。这通常意味着将 bamboo 用户在主机系统上映射到的 UID 添加到主机系统上的 docker 组。但是,根据集群的上下文,对主机系统进行更改可能是也可能不是一个选项,并且在集群上下文中很棘手,因为 pod 可能会迁移到未应用更改的其他节点 and/or UID 更改。

  • 或者将容器更改为 运行 作为具有足够特权的用户开始,成为 root 用户。有两种方法可以实现此目的:1. 扩展和自定义 Atlassian 提供的基础映像以更改用户,或者 2. 在 运行 时覆盖用户容器 运行s,方法是'runAsUser' 和 'runAsGroup' securityContext 指令,如指定的 here。两者都应为“0”。

处理这个问题的更好方法是 运行 一个边车容器 - docker:dind,并在主 Bamboo 容器中导出 DOCKER_HOST=tcp://dind:2375。这样你就可以在 dind 容器中调用 Docker 而不需要挂载 /var/run/docker.sock