问题现象
pull镜像有些layer层一直处于Retrying,如下
1
2
3
4
5
6
7
8
|
6a56b4def9c4: Retrying in 11 seconds
731bcd9b962b: Download complete
b58cd78ec81d: Retrying in 11 seconds
eda07c7847c3: Download complete
40ab7eabb7a4: Download complete
08888a06c9d6: Retrying in 11 seconds
8bf737cac800: Waiting
246e4dcd850f: Waiting
|
超过重试次数后,提示“unexpected EOF”。
不能pull,但可以push,在push后的短暂时间内可以pull,过段时间又会出现同样错误
环境
私有镜像仓库服务端环境:docker-registry运行在nginx后端。
客户端:任意docker客户端
排查
排查了docker-registry服务相关日志,未发现有异样错误信息。折腾好一会未果后,查了nginx的error日志,发现问题所在,类似错误日志如下
1
|
[crit] 2341093#0: *278055 open() "/var/lib/nginx/tmp/proxy/5/33/0000069335" failed (13: Permission denied) while reading upstream
|
可以看出是nginx没有权限读取目录,查看目录信息
1
2
3
4
5
6
7
|
[root@10.202.33.201 ~]# ls -l /var/lib/nginx/tmp/
total 20
drwx------. 2 root root 4096 Mar 23 16:10 client_body
drwx------. 2 root root 4096 Jan 13 18:00 fastcgi
drwx------. 12 root root 4096 Feb 25 13:35 proxy
drwx------. 2 root root 4096 Jan 13 18:00 scgi
drwx------. 2 root root 4096 Jan 13 18:00 uwsgi
|
目录用户和用户组都是root,而nginx的worker进程是以nginx用户运行的,故没有权限操作相关目录。
那为啥nginx进程是以nginx用户运行的,创建的目录拥有者为何是root呢?一开始以为是nginx可能以前是root身份运行,后续改回nginx用户身份,但经测试验证,此情况不会出现问题。之后经过一系列排查,发现是因为该环境同时运行了多个nginx服务,其中有一个nginx服务是以root身份运行,这样相互作用于同个目录才导致问题的出现。
解决
可以是统一让所有nginx服务以相同的身份运行,如下
1
2
3
4
5
|
vim nginx.conf #在行首指定:user xxx;
rm -rf /var/lib/nginx/tmp/*
nginx -c /xxx/nginx.conf -s reload
|
或者既然是两个独立的nginx服务,就应该指定不同的主目录/var/lib/nginx