我正在尝试设置一个 Nexus 存储库以供 Docker Swarm 使用。但是,我看到了一些奇怪的行为,我不确定这是我做的还是一个错误,因为它似乎从 3.12 开始就存在了(这是第一个具有 S3 blob 存储的版本,所以这是我第一次使用 Nexus)
我看到的行为是docker pull
有效的,但当我执行时,docker swarm deploy
它说无法访问图像。我没有遇到图像问题registry:2
。
以下是显示其成功运行的输出docker pull
。这也意味着我已正确验证。
$ sudo docker pull repo.devhaus.com/mylj-api:latest
latest: Pulling from mylj-api
Digest: sha256:e6ca3333cbe6d8c1761b2af2548610b068e1a268dac437598fb76a5b4102f9eb
Status: Downloaded newer image for repo.devhaus.com/mylj-api:latest
docker-compose.yml
用于部署的文件是
version: '3.4'
services:
apidoc:
image: repo.devhaus.com/mylj-api
然而,当我尝试部署时,我得到了
$ sudo docker stack deploy apidoc -c apidoc.yml --with-registry-auth --prune
Updating service apidoc_apidoc (id: odj2sgw8zugthjfk4jom1erms)
image repo.devhaus.com/mylj-api:latest could not be accessed on a registry to record
its digest. Each node will access repo.devhaus.com/mylj-api:latest independently,
possibly leading to different nodes running different
versions of the image.
我还试图赋予用户nx-admin
他们实际上不应该拥有的权限,因为他们需要做的只是从存储库中读取,而不是写入。
在/var/log/messages
以下情况下出现docker stack deploy
但不出现在docker pull
Oct 17 01:25:59 ip-10-70-1-11 dockerd: time="2018-10-17T01:25:59.853065022Z" level=error msg="Handler for GET /v1.38/distribution/repo.devhaus.com/mylj-api:latest/json returned error: missing or empty Content-Length header"
我想这docker stack deploy
可能是在提出HEAD
请求。
以下工作:
curl --user XXXX:YYYY https://repo.devhaus.com/v2/mylj-api/manifests/latest
以下基本上HEAD
相当于请求给出了 404 :
curl -I --user XXXX:YYYY https://repo.devhaus.com/v2/mylj-api/manifests/latest does not and gives a 404
我还确认这不是代理问题,因为我直接点击了暴露的端口并得到了与上述相同的结果。
答案1
显然,这是自 2017 年 3 月以来 Nexus 3.2.0 中的一个错误(所以它已经有一年多了)https://issues.sonatype.org/browse/NEXUS-12684我想我们需要找到一个支持 Docker 的替代存储库系统。
或者作为暂时的解决方法,我创建了一个简单的代理服务器,允许构建不正确的服务器支持请求HEAD
。 https://hub.docker.com/r/trajano/fakehead/