在Kubernetes中使用docker-dind运行私有镜像的认证问题
问题:Kubernetes中Docker-in-Docker拉取私有镜像失败,无法读取认证凭证
在Kubernetes中搭配docker-dind容器运行私有Docker镜像时,执行docker run命令提示需先运行docker login,无法读取已配置的docker-secrets,导致拉取私有镜像失败。
当前Deployment片段:
containers: - name: docker-private image: docker:20.10 command: ['docker', 'run', '-p', '80:8000', 'private/image:latest' ] resources: requests: cpu: 10m memory: 256Mi env: - name: DOCKER_HOST value: tcp://localhost:2375 envFrom: - secretRef: name: docker-secret-keys - name: dind-daemon image: docker:20.10-dind command: ["dockerd", "--host", "tcp://127.0.0.1:2375"] resources: requests: cpu: 20m memory: 512Mi securityContext: privileged: true volumeMounts: - name: docker-graph-storage mountPath: /var/lib/docker
已创建的Kubernetes Secret:
apiVersion: v1 data: .dockerconfigjson: eyJhXXXXXXdoihfc9w8fwpeojfOFwhfoiuwehfo8wfhoi2ehfioewNlcm5hbWUiOiJlbGRhcmVudGas4hti45ytg45hgiVsZGFXXXXXXyQGVudG9yLmlvIiwiYXV0aCI6IlpXeGtZWEpsYm5SdmNqb3dObVl4WmpjM1lTMDVPRFZrTFRRNU5HRXRZVEUzTXkwMk5UYzBObVF4T0RjeFpUWT0ifX19XXXXXXXXXXX kind: Secret metadata: name: staging-docker-keys namespace: staging resourceVersion: "6383" uid: a7yduyd-xxxx-xxxx-xxxx-ae2ede3e4ed type: kubernetes.io/dockerconfigjson
最终目标:让运行private/image:latest的"内部Docker"无需提前登录即可执行任意Docker命令。
解决方案
1. 挂载Docker配置文件到docker-private容器
Docker客户端默认读取/root/.docker/config.json路径的认证配置,因此需要将kubernetes.io/dockerconfigjson类型的Secret挂载到该路径,而不是用envFrom注入环境变量。
修改Deployment配置:
containers: - name: docker-private image: docker:20.10 command: ['docker', 'run', '-p', '80:8000', 'private/image:latest' ] resources: requests: cpu: 10m memory: 256Mi env: - name: DOCKER_HOST value: tcp://localhost:2375 volumeMounts: # 新增挂载Docker配置文件 - name: docker-config mountPath: /root/.docker readOnly: true - name: dind-daemon image: docker:20.10-dind command: ["dockerd", "--host", "tcp://127.0.0.1:2375"] resources: requests: cpu: 20m memory: 512Mi securityContext: privileged: true volumeMounts: - name: docker-graph-storage mountPath: /var/lib/docker # 新增volumes定义 volumes: - name: docker-graph-storage emptyDir: {} # 原有的存储卷,保持不变 - name: docker-config secret: secretName: staging-docker-keys items: - key: .dockerconfigjson path: config.json # 将Secret中的key映射为容器内的config.json
2. 验证配置是否生效
可以临时修改docker-private容器的命令,先检查配置文件是否正确挂载:
command: ['sh', '-c', 'cat /root/.docker/config.json && docker run -p 80:8000 private/image:latest']
确认配置文件内容正确后,Docker客户端会自动使用其中的认证信息拉取私有镜像。
3. 可选:让dind-daemon直接使用认证配置
如果需要dind-daemon本身也能拉取私有镜像(比如内部容器需要从私有仓库拉取镜像),可以将同一个Secret挂载到dind容器的/root/.docker路径:
- name: dind-daemon image: docker:20.10-dind command: ["dockerd", "--host", "tcp://127.0.0.1:2375"] resources: requests: cpu: 20m memory: 512Mi securityContext: privileged: true volumeMounts: - name: docker-graph-storage mountPath: /var/lib/docker # 新增挂载Docker配置文件 - name: docker-config mountPath: /root/.docker readOnly: true
关键注意点
envFrom无法直接传递Docker认证信息,因为Docker客户端不识别这种形式的环境变量注入,挂载配置文件是标准做法。- 确保Secret的
type为kubernetes.io/dockerconfigjson,且.dockerconfigjson字段是正确的Base64编码内容。
内容的提问来源于stack exchange,提问作者Noam Elbaz
相关产品推荐
相关产品推荐

