Docker推送镜像至私有Registry时证书目录权限被拒问题咨询
问题原因及解决方案
错误根源
你碰到的这个permission denied错误,核心原因是你使用的是Snap版本的Docker(从进程名snap.docker.dockerd能明确看出来),而Snap包是沙箱化运行的——它默认只能访问预定义的系统目录和资源,你自定义的/etc/certs目录不在Snap Docker的权限白名单里,所以AppArmor安全模块直接拒绝了dockerd进程访问该目录的请求,这就是journalctl日志里记录的AppArmor拒绝事件的由来。
Ubuntu 18.04默认可能会通过Snap安装Docker,但Snap的沙箱机制会给这类跨目录访问带来限制,这和你参考的Ubuntu 16.04教程里的Docker安装方式(通常是Debian包或官方二进制)完全不同,所以教程里的步骤在Snap版Docker上会踩权限坑。
解决方案
这里给你三个可行的解决方向,按推荐程度排序:
1. 将证书移到Snap Docker允许访问的目录
这是最符合Snap沙箱设计的方案,不用修改任何安全规则:
- 在客户端创建Snap Docker专属的证书目录:
sudo mkdir -p /var/snap/docker/common/var-lib-docker/certs.d/registry-server:5000/ - 复制你的
ca.crt到这个目录:sudo cp /etc/certs/ca.crt /var/snap/docker/common/var-lib-docker/certs.d/registry-server:5000/ - 重启Snap Docker服务:
sudo snap restart docker
之后再尝试docker push,应该就能正常访问证书了。
2. 修改AppArmor规则,允许Snap Docker访问/etc/certs
如果你不想移动证书,可以手动给Snap Docker添加目录访问权限:
- 找到Snap Docker的AppArmor配置文件:
/var/lib/snapd/apparmor/profiles/snap.docker.dockerd - 用文本编辑器(比如nano)打开这个文件,在规则列表里添加两行:
/etc/certs/ r, /etc/certs/** r, - 重新加载AppArmor配置:
sudo apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap.docker.dockerd - 重启Docker服务:
sudo snap restart docker
⚠️ 注意:下次Snap更新Docker时,这个自定义的AppArmor规则可能会被覆盖,需要重新添加。
3. 替换为非Snap版本的Docker
如果不想受Snap沙箱的限制,直接换成官方的Debian包版本:
- 先卸载Snap版Docker:
sudo snap remove docker - 按照Docker官方文档的步骤安装Debian版Docker(Ubuntu 18.04适用),完成后把
ca.crt放回你原来的/etc/docker/certs.d/registry-server:5000/目录,重启Docker服务即可。这种方式和你参考的Ubuntu 16.04教程环境完全一致,后续操作不会再遇到Snap相关的权限问题。
内容的提问来源于stack exchange,提问作者Roham Tehrani
相关产品推荐
相关产品推荐

