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版本:

已安装 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