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 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中添加 Atlassian Bamboo 变量?
RoboCopy + Atlassian Bamboo 持续集成
使用 Atlassian Bamboo 的 Android CI