
如果你使用 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 TeamCity实例的镜像,已在Fedora 23和CentOS 7系统上测试通过。
请务必定期备份数据目录,尤其是在升级到新版本之前。
shdocker run -it --publish 8111:8111 agross/teamcity
http://localhost:8111。确定TeamCity数据和日志的存储位置,设置域名/服务器名及公共端口:
shTEAMCITY_DATA="/var/data/teamcity" TEAMCITY_LOGS="/var/log/teamcity" DOMAIN=example.com PORT=8011
在容器外部创建用于存储数据和日志的目录:
shmkdir --parents "$TEAMCITY_DATA" \ "$TEAMCITY_LOGS"
Dockerfile中创建了teamcity用户和组,其UID和GID均为3000。需在主机系统创建具有相同UID和GID的用户,并授予对$TEAMCITY_DATA和$TEAMCITY_LOGS的读写权限:
sh# 在Docker主机创建teamcity组和用户 groupadd --gid 3000 \ --system teamcity useradd --uid 3000 \ --gid 3000 \ --system \ --shell /sbin/nologin \ --comment "JetBrains TeamCity" \ teamcity # 设置目录权限(3000为Dockerfile中创建的用户/组ID) chown -R 3000:3000 "$TEAMCITY_DATA" "$TEAMCITY_LOGS"
注意: 卷挂载时的:z选项用于正确设置SELinux上下文,详情参见相关文档。
可通过--env指定JVM和TeamCity服务器选项,例如内存配置。需挂载/etc/localtime以保持与主机相同的时区。
shdocker create -it --env TEAMCITY_SERVER_MEM_OPTS='-Xms1g -Xmx3g' \ --publish $PORT:8111 \ --volume /etc/localtime:/etc/localtime:ro \ --volume "$TEAMCITY_DATA:/teamcity/.BuildServer:z" \ --volume "$TEAMCITY_LOGS:/teamcity/logs:z" \ --name teamcity \ agross/teamcity
创建/etc/systemd/system/teamcity.service文件:
shcat <<EOF > "/etc/systemd/system/teamcity.service" [Unit] Description=JetBrains TeamCity Server 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 teamcity ExecStop=/usr/bin/docker stop --time=60 teamcity [Install] WantedBy=multi-user.target EOF systemctl enable teamcity.service systemctl start teamcity.service
创建/etc/logrotate.d/teamcity文件:
shcat <<EOF > "/etc/logrotate.d/teamcity" $TEAMCITY_LOGS/*.log { rotate 7 daily dateext missingok notifempty sharedscripts copytruncate compress } EOF
创建/etc/nginx/conf.d/teamcity.conf文件:
shcat <<EOF > "/etc/nginx/conf.d/teamcity.conf" upstream teamcity { server localhost:$PORT; } map $http_upgrade $connection_upgrade { default upgrade; '' ''; } 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; proxy_read_timeout 1200; proxy_connect_timeout 240; # 解决HTTP 411错误:参见issue #1486 (https://gitteamcity.com/dotcloud/docker/issues/1486) chunked_transfer_encoding on; location / { proxy_pass http://teamcity; 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 $connection_upgrade; } } EOF nginx -s reload
确保SELinux策略允许Nginx访问$PORT(步骤4中--publish $PORT:8111的第一个端口):
shEXPR="^http_port_t\s+tcp\s.*\b$PORT\b" if ! semanage port --list | grep --quiet --perl-regexp "$EXPR"; 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 --perl-regexp "$EXPR" 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 --perl-regexp "$EXPR" fi
按照JetBrains TeamCity的安装配置指南进行配置,容器内的配置路径为/teamcity/.BuildServer。
shdocker pull agross/teamcity systemctl stop teamcity.service # 备份数据目录 tar -zcvf "teamcity-data-$(date +%F-%H-%M-%S).tar.gz" "$TEAMCITY_DATA" docker rm teamcity # 重复步骤4创建新容器 docker create ... systemctl start teamcity.service
若需连接使用自签名证书的服务(如LDAP服务器或NuGet源),需将证书添加到容器内JVM的信任库:
shHOST=ldap.example.com:636 docker exec -it -u root teamcity_teamcity_1 bash -c " set -o pipefail echo -n | openssl s_client -connect "$HOST" | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > "/tmp/$HOST" && "\$JAVA_HOME/bin/keytool" -import \ -alias "$HOST" \ -file "/tmp/$HOST" \ -keystore "\$JAVA_HOME/jre/lib/security/cacerts" \ -noprompt \ -storepass changeit && rm /tmp/$HOST"
shdocker build --tag agross/teamcity:testing . docker images # 应显示: # REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE # agross/teamcity testing 0dcb8bf6093f 49 seconds ago 405.4 MB
shTEST_DIR="/tmp/teamcity-testing" mkdir --parents "$TEST_DIR/data" \ "$TEST_DIR/logs" chown -R 3000:3000 "$TEST_DIR"
注意: 卷挂载时的:z选项用于正确设置SELinux上下文,详情参见相关文档。
shdocker run -it --rm \ --name teamcity-testing \ --publish 8111:8111 \ --volume "$TEST_DIR/data:/teamcity/.BuildServer:z" \ --volume "$TEST_DIR/logs:/teamcity/logs:z" \ agross/teamcity:testing
shdocker exec -it teamcity-testing bash
shdocker run -it --rm \ --name teamcity-testing \ --publish 8111:8111 \ --volume "$TEST_DIR/data:/teamcity/.BuildServer:z" \ --volume "$TEST_DIR/logs:/teamcity/logs:z" \ agross/teamcity:testing \ bash
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务