我认为这是一个非常奇怪和有趣的问题。
我有一个客户端证书认证的 docker 注册表设置,宽度 apache 的帮助。我已根据 this 将必要的证书文件放入相应的文件夹中文章。
Docker pull/push 给出了这个错误信息:
Error response from daemon: Get https://***:9443/v2/: remote error: tls: alert(116)
我认为我的证书文件是正确的并放在适当的位置,因为 docker pull 和 push 在 linux 机器上正常工作,我只能在 WSL 系统上重现这个问题。
此命令正常工作,并给出了我从 linux 机器推送的图像名称。
curl --cacert ca.crt --key client.key --cert client.cert " https://***:9443/v2/_catalog"
我认为问题在于我的证书文件的宽度。
我也试过运行这个命令:
docker --debug --tlsverify --tlscacert /home/user/.docker/certs.d/***:9443/ca.crt --tlscert /home/user/.docker/certs.d/***:9443/client.cert --tlskey /home/user/.docker/certs.d/***:9443/client.key pull ***:9443/hello-world-test
输出是这样的,我无法理解。当然 docker daemon 正在运行:
Using default tag: latest DEBU[0000] FIXME: Got an status-code for which error does not match any expected type!!!: -1 module=api status_code=-1 Cannot connect to the Docker daemon at tcp://localhost:2376. Is the docker daemon running?
docker 版本:
安装的linux:
docker -compose.yml
services:
apache:
image: "httpd:2.4"
ports:
- 9443:9443
links:
- registry:registry
volumes:
- /opt/docker-registry-certauth/auth:/usr/local/apache2/conf:z
- /opt/docker-registry-certauth/log:/var/log/apache:z
registry:
image: registry:2
ports:
- 127.0.0.1:5000:5000
volumes:
- /opt/docker-registry-certauth/data:/var/lib/registry:z
如果有人能给我一些如何克服这个问题的建议,或者有人知道可能是什么问题,我将不胜感激。
最佳答案
经过大量研究后,我无法在 WSL2 系统上解决这个问题。但我想出了一个解决方法,不是最好的解决方案,但它有效。
我写了一个 bash 脚本,我暂时使用 docker dind 图像从经过验证的私有(private)客户端注册表中提取图像。
docker run --rm --privileged --name=win-dind -v $(pwd):/var/tmp -d docker:20.10-dind
在 dind images 运行后,我们将证书文件复制到适当的位置。dindImgId=$(docker ps -qf "name=win-dind")
docker exec -it $dindImgId mkdir -p /etc/docker/certs.d/$registryName/
docker cp ./cert/setup/ca.crt $dindImgId:/etc/docker/certs.d/$registryName/ca.crt
docker cp ./cert/setup/client.key $dindImgId:/etc/docker/certs.d/$registryName/client.key
docker cp ./cert/setup/client.cert $dindImgId:/etc/docker/certs.d/$registryName/client.cert
// Download the necessary images...
并且为了确保在我们启动 bash 脚本时不要一直下载每个图像,我们可以尝试在注册表中找到我们的本地镜像 ID 来解决它。download() {
currImageId=$(docker images --no-trunc --quiet $registryName/$modulName:$imageTag)
if [[ $currImageId != "" ]]
then
tmp=$(curl -s --cacert ./cert/setup/ca.crt --key ./cert/setup/client.key --cert ./cert/setup/client.cert -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -k -X GET https://$registryName/v2/$modulName/manifests/$imageTag | grep -c $currImageId)
if [[ $tmp = 0 ]]
then
docker exec -it $dindImgId docker pull $registryName/$modulName:$imageTag
updatedImages+="$registryName/$modulName:$imageTag "
else
echo "Not available newer version from $modulName modul."
fi
else
docker exec -it $dindImgId docker pull $registryName/$modulName:$imageTag
updatedImages+="$registryName/$modulName:$imageTag "
fi
}
最后,我将图像保存到一个 tar 文件中,并将其存储在/var/tmp 中。由于卷它会立即出现在主机上,而我们只需要加载它之后。docker exec -it $dindImgId docker save --output /var/tmp/pmsthf-images.tar $updatedImage
docker load < images.tar
关于linux - 无法将 docker 镜像推/拉到经过证书身份验证的私有(private)注册表? (仅适用于 WSL,远程错误 : tls: alert(116)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67968486/