如何在容器内使用Kubernetes的dockerconfigjson类型Secret登录Docker镜像仓库
方案一:直接挂载Secret为Docker配置(最推荐,零代码改造)
Kubernetes 中挂载的 Secret 默认使用 tmpfs 内存文件系统存储,不会写入节点或容器的持久化磁盘,Pod 销毁后数据会自动彻底清除,完全满足你不想留存文件的需求,不需要额外处理。
直接按照如下方式配置Pod即可:
apiVersion: v1 kind: Pod metadata: name: dind-demo spec: containers: - name: dind image: docker:dind securityContext: privileged: true # docker-in-docker必须开启特权模式 volumeMounts: - name: docker-config mountPath: /root/.docker # Docker默认读取配置的根目录 readOnly: true volumes: - name: docker-config secret: secretName: docker-artifactor-cred items: - key: .dockerconfigjson path: config.json # 直接映射为Docker要求的配置文件名
配置完成后容器内直接可以执行docker pull/push等操作,不需要手动执行login命令。
方案二:脚本内动态解析使用(适合不想挂载配置目录的场景)
如果你有特殊要求不能直接挂载配置目录,可以将Secret的内容注入为环境变量,在脚本内动态解析使用,用完即删:
第一步:Pod配置中注入Secret内容到环境变量
apiVersion: v1 kind: Pod metadata: name: dind-demo spec: containers: - name: dind image: docker:dind securityContext: privileged: true env: - name: DOCKER_CONFIG_JSON valueFrom: secretKeyRef: name: docker-artifactor-cred key: .dockerconfigjson
第二步:shell脚本中动态处理
#!/bin/sh # 按需安装依赖(官方dind镜像默认没有jq,需要先安装) apk add --no-cache jq coreutils # 解码Docker配置 DECODED_CFG=$(echo "$DOCKER_CONFIG_JSON" | base64 -d) # 替换为你实际的镜像仓库地址 REGISTRY="https://your-artifact-repo.com" ### 方式1:解析出账号密码直接登录,操作完成后清理 USER=$(echo "$DECODED_CFG" | jq -r ".auths[\"$REGISTRY\"].username") PASS=$(echo "$DECODED_CFG" | jq -r ".auths[\"$REGISTRY\"].password") echo "$PASS" | docker login "$REGISTRY" -u "$USER" --password-stdin # 执行你需要的Docker操作,比如拉取、推送镜像 docker pull your-artifact-repo.com/your-image:v1 # 操作完成后清理凭证 docker logout "$REGISTRY" unset USER PASS DECODED_CFG DOCKER_CONFIG_JSON ### 方式2:不解析账号密码,临时生成配置文件用完删除 # mkdir -p /tmp/docker-tmp # echo "$DECODED_CFG" > /tmp/docker-tmp/config.json # docker --config /tmp/docker-tmp pull your-artifact-repo.com/your-image:v1 # rm -rf /tmp/docker-tmp
内容的提问来源于stack exchange,提问作者Mukund Jalan
相关产品推荐
相关产品推荐

