You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:24:27