Unable to push/pull docker image to a certificate authenticated private registry? (Not workin only on WSL, remote error: tls: alert(116))
Unable to push/pull docker image to a certificate authenticated private registry? (Not workin only on WSL, remote error: tls: alert(116))
我认为这是一个非常奇怪和有趣的问题。
我有一个经过身份验证的客户端证书 docker 注册表设置,在 apache 的帮助下。我已根据 this 文章将必要的证书文件放入适当的文件夹。
Docker pull/push 给出此错误消息:
Error response from daemon: Get https://***:9443/v2/: remote error: tls: alert(116)
我认为我的证书文件是正确的并放在适当的位置,因为 docker 拉和推在 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 守护进程是 运行:
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版本:
- Docker 版本 20.10.5,内部版本 55c4c88
已安装 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 图像从私有客户端身份验证注册表中提取图像。
docker run --rm --privileged --name=win-dind -v $(pwd):/var/tmp -d docker:20.10-dind
dind 镜像运行后,我们将证书文件复制到适当的位置。
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...
并且为了确保在我们 tar 运行我们的 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
我认为这是一个非常奇怪和有趣的问题。
我有一个经过身份验证的客户端证书 docker 注册表设置,在 apache 的帮助下。我已根据 this 文章将必要的证书文件放入适当的文件夹。
Docker pull/push 给出此错误消息:
Error response from daemon: Get https://***:9443/v2/: remote error: tls: alert(116)
我认为我的证书文件是正确的并放在适当的位置,因为 docker 拉和推在 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 守护进程是 运行:
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版本:
- Docker 版本 20.10.5,内部版本 55c4c88
已安装 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 图像从私有客户端身份验证注册表中提取图像。
docker run --rm --privileged --name=win-dind -v $(pwd):/var/tmp -d docker:20.10-dind
dind 镜像运行后,我们将证书文件复制到适当的位置。
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...
并且为了确保在我们 tar 运行我们的 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