自建Notary服务对接Nexus私有仓库的配置与问题排查
你已经搞定了Notary基础搭建和初步对接的大部分流程,现在碰到的两个核心问题——默认推送不触发签名、签名后Notary列表查不到内容,我来帮你梳理下需要补充的关键配置:
一、解决默认推送不触发签名的问题
你设置了DOCKER_CONTENT_TRUST=1但sudo docker push未生效,核心原因是sudo会重置环境变量,导致Docker无法读取到你当前用户的环境配置。可以通过以下几种方式解决:
临时方案:用
sudo -E保留环境变量
执行推送命令时带上-E参数,让sudo继承当前用户的环境变量:sudo -E docker push nexus.xyz.com:5000/nginx:latest持久化方案:给root用户添加环境变量
编辑root用户的~/.bashrc文件,添加以下内容:export DOCKER_CONTENT_TRUST=1 export DOCKER_CONTENT_TRUST_SERVER=https://notary-server:4443执行
source ~/.bashrc让配置立即生效,之后用sudo执行Docker命令就会默认启用内容信任。全局方案:修改Docker daemon配置(推荐)
编辑Docker daemon配置文件/etc/docker/daemon.json(不存在则创建),添加内容:{ "content-trust": true, "content-trust-server": "https://notary-server:4443" }重启Docker服务使配置生效:
sudo systemctl restart docker这样所有Docker操作都会默认启用内容信任,无需每次手动设置环境变量。
二、解决notary list看不到可信内容的问题
签名推送后notary list无输出,需要检查以下几个关键配置:
确保Notary客户端配置指向正确服务器
检查当前用户(及root用户)的~/.notary/config.json文件,确认server.url字段正确指向你的Notary服务:{ "server": { "url": "https://notary-server:4443", "root_ca": "root-ca.crt" } }注意:如果用sudo执行notary命令,必须确保root用户的
~/.notary目录也有相同的配置文件和CA证书,因为sudo会切换到root环境。修正
notary list的命令格式
Notary的list命令是针对仓库名而非带tag的镜像名,正确的命令应该是:notary list nexus.xyz.com:5000/nginx(去掉末尾的
:latest标签部分)让Notary服务器能解析Nexus域名
你的Notary服务运行在本地容器中,需要确保容器能解析到Nexus的域名。修改docker-compose.yml,给notary_server和notary_signer添加hosts映射:services: notary_server: extra_hosts: - "nexus.xyz.com:192.168.x.x" # 替换为Nexus机器的实际IP notary_signer: extra_hosts: - "nexus.xyz.com:192.168.x.x"修改后重启容器:
docker-compose down && docker-compose up -d验证Nexus的DCT配置
确保你的Nexus版本(3.x及以上)支持Docker Content Trust,并且在Nexus的Docker仓库配置中启用了“Enable Docker Content Trust”选项。确认Notary服务器使用数据库存储
检查docker-compose.yml中的notary_server配置,确保它正确连接到mariadb数据库:notary_server: environment: - DB_URL=mysql://notary:notarysecret@mariadb:3306/notaryserver?parseTime=true这一步确保签名数据被持久化到数据库,而不是容器本地临时存储。
三、验证配置是否生效
完成上述配置后,执行以下步骤验证:
- 重新推送镜像(此时应该自动触发签名):
sudo docker push nexus.xyz.com:5000/nginx:latest - 查看仓库的可信内容:
notary list nexus.xyz.com:5000/nginx - 尝试拉取镜像,验证签名是否生效:
如果配置正确,拉取时会自动验证签名,若签名无效或不存在会直接报错。sudo docker pull nexus.xyz.com:5000/nginx:latest
内容的提问来源于stack exchange,提问作者Chayan

