
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Portus是Docker Registry v2.1及以上版本的授权服务器和用户界面,基于sshipway/Portus仓库构建(SUSE/Portus的分支)。它实现了Docker Registry API v2的认证机制,支持Registry 2.1、2.2和2.3版本,提供用户和团队管理、镜像权限控制、Web界面等功能。容器包含初始化脚本,可自动处理数据库初始化、证书创建、Nginx SSL配置等。
Portus适用于需要搭建私有Docker镜像仓库并进行精细化权限管理的场景,包括:
| 环境变量 | 描述 |
|---|---|
PORTUS_MACHINE_FQDN | Portus服务器的完全限定域名 |
PORTUS_KEY_PATH | 证书密钥路径,若不存在将自动生成自签名证书 |
PORTUS_PRODUCTION_HOST | MySQL数据库主机 |
PORTUS_PRODUCTION_DATABASE | 数据库名称 |
PORTUS_PRODUCTION_USERNAME | 数据库用户名 |
PORTUS_PRODUCTION_PASSWORD | 数据库密码 |
PORTUS_PASSWORD | Portus管理员密码 |
PORTUS_SECRET_KEY_BASE | Rails应用的密钥 |
PORTUS_LDAP_ENABLED | 是否启用LDAP认证(true/false) |
PORTUS_LDAP_HOSTNAME | LDAP服务器主机名 |
PORTUS_LDAP_PORT | LDAP服务器端口 |
PORTUS_LDAP_METHOD | LDAP连接方法(如starttls) |
PORTUS_SMTP_ENABLED | 是否启用SMTP邮件通知 |
简单配置(无SSL,本地认证)
bashdocker run \ -d --restart=always --name portus-mysql \ -e MYSQL_DATABASE=portus \ -e MYSQL_ROOT_PASSWORD="$ROOTPASSWORD" \ -e MYSQL_USER=portus \ -e MYSQL_PASSWORD="$DBPASSWORD" \ -v $DIR/portus:/var/lib/mysql \ mysql
bashdocker run \ -d --restart=always --name portus \ -e PORTUS_MACHINE_FQDN=$DOMAIN \ --link=portus-mysql:portus-mysql \ -e PORTUS_PRODUCTION_HOST=portus-mysql \ -e PORTUS_PRODUCTION_DATABASE=portus \ -e PORTUS_PRODUCTION_USERNAME=portus \ -e PORTUS_PRODUCTION_PASSWORD="$DBPASSWORD" \ -e PORTUS_GRAVATAR_ENABLED=true \ -e PORTUS_CHECK_SSL_USAGE_ENABLED=false \ -p 80:3000 \ -e PORTUS_PASSWORD="$DBPASSWORD" \ -e PORTUS_SECRET_KEY_BASE="$KEY" \ sshipway/portus:latest
完整配置(含SSL、认证、Webhooks)
bashdocker run -d -p 5000:5000 --restart=always --name registry \ -e REGISTRY_LOG_LEVEL=warn \ -v $DIR/data:/var/lib/registry \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ -v $DIR/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \ -e REGISTRY_AUTH_TOKEN_REALM=https://docker.example.com:443/v2/token \ -e REGISTRY_AUTH_TOKEN_SERVICE=docker.example.com:5000 \ -e REGISTRY_AUTH_TOKEN_ISSUER=docker.example.com \ -e REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/server.crt \ -e REGISTRY_NOTIFICATIONS_ENDPOINTS_NAME=portus \ -e REGISTRY_NOTIFICATIONS_ENDPOINTS_URL=https://docker.example.com:443/v2/webhooks/events \ -e REGISTRY_NOTIFICATIONS_ENDPOINTS_TIMEOUT=500 \ -e REGISTRY_NOTIFICATIONS_ENDPOINTS_THRESHOLD=5 \ -e REGISTRY_NOTIFICATIONS_ENDPOINTS_BACKOFF=1 \ registry:2.1
bashdocker run \ -d --restart=always --name portus-mysql \ -e MYSQL_DATABASE=portus \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_USER=portus \ -e MYSQL_PASSWORD=dbpassword \ -v $DIR/portus:/var/lib/mysql \ mysql
bashdocker run \ -d --restart=always --name portus \ -e PORTUS_MACHINE_FQDN=docker.example.com \ --link=registry:registry \ -e PORTUS_LDAP_ENABLED=true \ -e PORTUS_LDAP_HOSTNAME=ldap.example.com \ -e PORTUS_LDAP_PORT=389 \ -e PORTUS_LDAP_METHOD=starttls \ -e PORTUS_LDAP_BASE=ou=People,dc=example,dc=com \ -e PORTUS_LDAP_UID=cn \ -e PORTUS_LDAP_AUTHENTICATION_ENABLED=true \ -e PORTUS_LDAP_AUTHENTICATION_BIND_DN=cn=portus,dc=example,dc=com \ -e PORTUS_LDAP_AUTHENTICATION_PASSWORD=ldappassword \ -e PORTUS_LDAP_GUESS_EMAIL_ENABLED=true \ -e PORTUS_LDAP_GUESS_EMAIL_ATTR=mail \ --link=portus-mysql:portus-mysql \ -e PORTUS_PRODUCTION_HOST=portus-mysql \ -e PORTUS_PRODUCTION_DATABASE=portus \ -e PORTUS_PRODUCTION_USERNAME=portus \ -e PORTUS_PRODUCTION_PASSWORD=dbpassword \ -e PORTUS_GRAVATAR_ENABLED=true \ -e PORTUS_EMAIL_FROM=docker@example.com \ -e PORTUS_EMAIL_REPLY_TO=nobody@example.com \ -e PORTUS_SMTP_ENABLED=true \ -e PORTUS_SMTP_ADDRESS=mail.example.com \ -e PORTUS_KEY_PATH=/certs/server.key \ -v $DIR/certs:/certs \ -e PORTUS_PASSWORD="password" \ -e PORTUS_SECRET_KEY_BASE="apikeybase" \ -e REGISTRY_USE_SSL=true \ -e REGISTRY_NAME=Registry \ -e REGISTRY_HOSTNAME=docker.example.com \ -e REGISTRY_PORT=5000 \ -e PORTUS_CHECK_SSL_USAGE_ENABLED=true \ -v $DIR/proxy:/etc/nginx/conf.d \ sshipway/portus:2.0.0
bashdocker run -d --restart=always \ --link=portus \ --name=portus-ssl \ -p 443:443 \ -v $DIR/proxy:/etc/nginx/conf.d \ -v $DIR/certs:/etc/nginx/certs \ -e NGINX_CERT_FILE=/etc/nginx/certs/server.crt \ -e NGINX_KEY_FILE=/etc/nginx/certs/server.key \ -e NGINX_DOMAIN=docker.example.com \ nginx
证书生成:若设置PORTUS_MACHINE_FQDN和PORTUS_KEY_PATH且密钥文件不存在,启动脚本将生成自签名证书,存储在PORTUS_KEY_PATH(证书为同路径下的.crt文件),默认路径为/certs,建议挂载为卷共享。
Nginx配置:/etc/nginx/conf.d为可导出卷,容器会生成portus.conf配置文件,适用于SSL卸载代理。挂载该路径到Nginx容器并共享/certs卷,可自动配置Nginx。示例portus.conf:
nginxserver { listen 443 ssl; ssl_certificate certs/registry.crt; ssl_certificate_key certs/registry.key; location / { proxy_set_header Host docker.example.com; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host docker.example.com:443; proxy_pass http://portus:3000/; proxy_http_version 1.1; proxy_set_header Connection "upgrade"; proxy_read_timeout 900s; } }
Portus基于Apache License 2.0许可,详见https://github.com/SUSE/Portus/blob/master/LICENSE%E3%80%82
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。





来自真实用户的反馈,见证轩辕镜像的优质服务