
如果你使用 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 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
该Dockerfile用于构建部署JetBrains Upsource实例的镜像,已在Fedora 23和CentOS 7系统上测试通过。
请记得定期备份数据目录,尤其是在升级到新版本之前。
shdocker run -it -p 8080:8080 agross/upsource
http://localhost:8080。systemd 229及更高版本默认将单元的任务数限制为512。任务等同于线程(内核和用户空间线程)。Upsource容器启动后约运行740个线程。
如果出现 java.lang.OutOfMemoryError unable to create new native thread 错误,需增加Upsource容器systemd作用域的任务限制或所有单元的默认任务限制:
shvim /etc/systemd/system.conf.d/default-tasks-max-required-for-upsource.conf
粘贴以下内容:
[Manager] DefaultTasksMax=infinity
shsystemctl daemon-reexec
确定Upsource数据和日志的存储位置,设置域名/服务器名及公共端口:
shUPSOURCE_DATA="/var/data/upsource" UPSOURCE_LOGS="/var/log/upsource" DOMAIN=example.com PORT=8013
在容器外部创建用于存储数据和日志的目录:
shmkdir --parents "$UPSOURCE_DATA/backups" \ "$UPSOURCE_DATA/conf" \ "$UPSOURCE_DATA/data" \ "$UPSOURCE_LOGS"
Dockerfile创建了UID和GID均为6000的upsource用户和组。需在主机系统添加具有相同UID和GID的用户,并允许其读写$UPSOURCE_DATA和$UPSOURCE_LOGS目录。主机用户和组的名称不重要。
sh# 在Docker主机创建upsource组和用户,例如: groupadd --gid 6000 --system upsource useradd --uid 6000 --gid 6000 --system --shell /sbin/nologin --comment "JetBrains Upsource" upsource # 6000是Dockerfile创建的upsource用户和组的ID chown -R 6000:6000 "$UPSOURCE_DATA" "$UPSOURCE_LOGS"
注意: 卷挂载的:z选项确保目录的SELinux上下文被正确设置。
需绑定挂载/etc/localtime以使用与Docker主机相同的时区。
shdocker create -it -p $PORT:8080 \ -v /etc/localtime:/etc/localtime:ro \ -v "$UPSOURCE_DATA/backups:/upsource/backups:z" \ -v "$UPSOURCE_DATA/conf:/upsource/conf:z" \ -v "$UPSOURCE_DATA/data:/upsource/data:z" \ -v "$UPSOURCE_LOGS:/upsource/logs:z" \ --name upsource \ agross/upsource
创建 /etc/systemd/system/upsource.service:
shcat <<EOF > "/etc/systemd/system/upsource.service" [Unit] Description=JetBrains Upsource Requires=docker.service After=docker.service [Service] Restart=always # 当执行docker stop时,docker-entrypoint.sh的trap+wait组合会生成143的退出状态码(128+15,SIGTERM) # 更多信息:http://veithen.github.io/2014/11/16/sigterm-propagation.html SuccessExitStatus=143 PrivateTmp=true ExecStart=/usr/bin/docker start --attach=true upsource ExecStop=/usr/bin/docker stop --time=10 upsource [Install] WantedBy=multi-user.target EOF systemctl enable upsource.service systemctl start upsource.service
创建 /etc/logrotate.d/upsource:
shcat <<EOF > "/etc/logrotate.d/upsource" $UPSOURCE_LOGS/*.log $UPSOURCE_LOGS/cassandra/*.log $UPSOURCE_LOGS/hub/*.log $UPSOURCE_LOGS/internal/services/bundleProcess/*.log $UPSOURCE_LOGS/upsource-analyzer/*.log $UPSOURCE_LOGS/upsource-cluster-init/*.log $UPSOURCE_LOGS/upsource-frontend/*.log $UPSOURCE_LOGS/upsource-monitoring/*.log $UPSOURCE_LOGS/upsource-psi/*.log { rotate 7 daily dateext missingok notifempty sharedscripts copytruncate compress } EOF
创建 /etc/nginx/conf.d/upsource.conf:
shcat <<EOF > "/etc/nginx/conf.d/upsource.conf" upstream upsource { server localhost:$PORT; } server { listen 80; listen [::]:80; server_name $DOMAIN; access_log /var/log/nginx/$DOMAIN.access.log; error_log /var/log/nginx/$DOMAIN.error.log; # 不限制上传大小 client_max_body_size 0; # 避免HTTP 411错误:参见issue #1486 (https://github.com/dotcloud/docker/issues/1486) chunked_transfer_encoding on; location / { proxy_pass http://upsource; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-Host \$http_host; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_http_version 1.1; # 支持WebSocket proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass_header Sec-Websocket-Extensions; } } EOF nginx -s reload
确保SELinux策略允许Nginx访问端口$PORT(步骤3中-p $PORT:8080的第一部分):
shif [ $(semanage port --list | grep --count "^http_port_t.*$PORT") -eq 0 ]; then if semanage port --add --type http_port_t --proto tcp $PORT; then echo Added port $PORT as a valid port for nginx: semanage port --list | grep ^http_port_t else >&2 echo Could not add port $PORT as a valid port for nginx. Please add it yourself. More information: http://axilleas.me/en/blog/2013/selinux-policy-for-nginx-and-gitlab-unix-socket-in-fedora-19/ fi else echo Port $PORT is already a valid port for nginx: semanage port --list | grep ^http_port_t fi
按照JetBrains Upsource的安装说明步骤进行配置,使用容器内以下路径:
/upsource/backups/upsource/data/upsource/logs/upsource/tempshdocker pull agross/upsource systemctl stop upsource.service # 备份$UPSOURCE_DATA tar -zcvf "upsource-data-$(date +%F-%H-%M-%S).tar.gz" "$UPSOURCE_DATA" docker rm upsource # 重复步骤4创建新镜像 docker create ... systemctl start upsource.service
shdocker build --tag agross/upsource:testing . docker images # 应包含: # REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE # agross/upsource testing 0dcb8bf6093f 49 seconds ago 405.4 MB
shTEST_DIR="/tmp/upsource-testing" mkdir --parents "$TEST_DIR/backups" \ "$TEST_DIR/conf" \ "$TEST_DIR/data" \ "$TEST_DIR/logs" chown -R 6000:6000 "$TEST_DIR"
注意: 卷挂载的:z选项确保目录的SELinux上下文被正确设置。
shdocker run -it --rm \ --name upsource-testing \ -p 8080:8080 \ -v "$TEST_DIR/backups:/upsource/backups:z" \ -v "$TEST_DIR/conf:/upsource/conf:z" \ -v "$TEST_DIR/data:/upsource/data:z" \ -v "$TEST_DIR/logs:/upsource/logs:z" \ agross/upsource:testing
shdocker exec -it upsource-testing bash
注意: 卷挂载的:z选项确保目录的SELinux上下文被正确设置。
shdocker run -it -v "$TEST_DIR/backups:/upsource/backups:z" \ -v "$TEST_DIR/conf:/upsource/conf:z" \ -v "$TEST_DIR/data:/upsource/data:z" \ -v "$TEST_DIR/logs:/upsource/logs:z" \ agross/upsource:testing bash
不挂载数据目录:
shdocker run -it agross/upsource:testing bash
shdocker ps -aq --no-trunc --filter ancestor=agross/upsource:testing | xargs --no-run-if-empty docker rm docker images -q --no-trunc agross/upsource:testing | xargs --no-run-if-empty docker rmi rm -rf "$TEST_DIR"
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

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