欢迎光临开封市华金智网
详情描述
docker运行可登录的gerrit容器及遇到问题解决方案

一、运行Gerrit容器

1. 基础运行命令

# 使用官方镜像
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e CANONICAL_WEB_URL=http://localhost:8080 \
  -e AUTH_TYPE=DEVELOPMENT_BECOME_ANY_ACCOUNT \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

# 或使用更完整的配置
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e CANONICAL_WEB_URL=http://your-domain.com \
  -e GERRIT_INIT_ARGS='--install-plugin=download-commands' \
  -v gerrit_data:/var/gerrit/review_site \
  -v /path/to/certs:/var/gerrit/etc/ssl \
  gerritcodereview/gerrit:latest

2. 使用Docker Compose(推荐)

version: '3'
services:
  gerrit:
    image: gerritcodereview/gerrit:latest
    container_name: gerrit
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "29418:29418"
    environment:
      - CANONICAL_WEB_URL=http://localhost:8080
      - GERRIT_INIT_ARGS=--install-plugin=download-commands
      - AUTH_TYPE=LDAP  # 或 OAUTH, DEVELOPMENT_BECOME_ANY_ACCOUNT等
    volumes:
      - gerrit_data:/var/gerrit/review_site
      - ./gerrit.config:/var/gerrit/etc/gerrit.config:ro
    networks:
      - gerrit-network

volumes:
  gerrit_data:

networks:
  gerrit-network:
    driver: bridge

二、常见问题及解决方案

1. 无法通过HTTP登录(DEVELOPMENT_BECOME_ANY_ACCOUNT模式)

问题:使用DEVELOPMENT_BECOME_ANY_ACCOUNT模式时,无法通过HTTP登录。

解决方案

# 方法1:初始化时设置HTTP认证
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e GERRIT_INIT_ARGS='--batch --no-auto-start' \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

# 进入容器修改配置
docker exec -it gerrit bash

# 编辑gerrit.config,在[auth]部分添加
[auth]
  type = DEVELOPMENT_BECOME_ANY_ACCOUNT

# 重启容器
docker restart gerrit

# 方法2:使用预配置的配置
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e GERRIT_GIT_LOCALPATH=/var/gerrit/git \
  -e GERRIT_INIT_ARGS='--batch --install-plugin=download-commands' \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit /bin/sh -c "java -jar /var/gerrit/bin/gerrit.war init --batch --dev -d /var/gerrit/review_site && /var/gerrit/bin/gerrit.sh run"

2. LDAP认证配置问题

问题:LDAP认证失败。

解决方案

# 准备LDAP配置
cat > gerrit.config << 'EOF'
[gerrit]
  basePath = git
  canonicalWebUrl = http://localhost:8080/

[auth]
  type = LDAP
  logoutUrl = http://localhost:8080/

[ldap]
  server = ldap://ldap.example.com
  username = cn=admin,dc=example,dc=com
  password = your_password
  accountBase = ou=people,dc=example,dc=com
  groupBase = ou=groups,dc=example,dc=com

[container]
  user = root
  javaHome = /usr/lib/jvm/java-11-openjdk
  javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
EOF

# 运行容器
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -v gerrit_data:/var/gerrit/review_site \
  -v $(pwd)/gerrit.config:/var/gerrit/etc/gerrit.config:ro \
  gerritcodereview/gerrit:latest

3. SSH端口连接问题

问题:无法通过SSH连接Gerrit。

解决方案

# 检查SSH配置
docker exec -it gerrit cat /var/gerrit/etc/gerrit.config | grep sshd

# 如果SSH端口不是29418,可以重新映射
docker run -d \
  --name gerrit \
  -p 2222:29418 \  # 将容器内的29418映射到主机的2222
  -p 8080:8080 \
  -e CANONICAL_WEB_URL=http://localhost:8080 \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

# 生成SSH密钥(如果需要)
ssh-keygen -t rsa -f ~/.ssh/gerrit_key
docker exec -it gerrit cat /var/gerrit/etc/ssh_host_rsa_key.pub

4. 数据库连接问题

问题:使用外部数据库时连接失败。

解决方案

# docker-compose.yml
version: '3'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: gerrit
      POSTGRES_PASSWORD: gerrit_password
      POSTGRES_DB: gerrit
    volumes:
      - postgres_data:/var/lib/postgresql/data

  gerrit:
    image: gerritcodereview/gerrit:latest
    depends_on:
      - db
    environment:
      - DATABASE_TYPE=postgresql
      - DATABASE_HOSTNAME=db
      - DATABASE_PORT=5432
      - DATABASE_DATABASE=gerrit
      - DATABASE_USERNAME=gerrit
      - DATABASE_PASSWORD=gerrit_password
    volumes:
      - gerrit_data:/var/gerrit/review_site
    ports:
      - "8080:8080"
      - "29418:29418"

volumes:
  postgres_data:
  gerrit_data:

5. 插件安装问题

问题:插件安装失败或不可用。

解决方案

# 方法1:初始化时安装插件
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e GERRIT_INIT_ARGS='--install-plugin=download-commands --install-plugin=replication' \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

# 方法2:手动安装插件
# 下载插件到主机
wget https://gerrit-ci.gerritforge.com/job/plugin-download-commands-bazel-master/lastSuccessfulBuild/artifact/bazel-bin/plugins/download-commands/download-commands.jar

# 复制到容器
docker cp download-commands.jar gerrit:/var/gerrit/plugins/

# 重启容器
docker restart gerrit

6. 内存和性能问题

问题:Gerrit运行缓慢或内存不足。

解决方案

# 增加JVM内存参数
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e JAVA_OPTIONS="-Xmx4g -Xms2g -XX:MaxMetaspaceSize=512m" \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

# 或者通过环境变量设置
docker run -d \
  --name gerrit \
  -p 8080:8080 \
  -p 29418:29418 \
  -e GERRIT_HEAP_LIMIT=4g \
  -e GERRIT_HEAP_INIT=2g \
  -v gerrit_data:/var/gerrit/review_site \
  gerritcodereview/gerrit:latest

7. 查看日志和调试

# 查看实时日志
docker logs -f gerrit

# 查看特定时间段的日志
docker logs --since 1h gerrit

# 进入容器查看详细日志
docker exec -it gerrit bash
cd /var/gerrit/logs
tail -f error_log

# 检查Gerrit状态
docker exec -it gerrit /var/gerrit/bin/gerrit.sh status

8. 数据备份和恢复

# 备份Gerrit数据
docker exec gerrit tar czf /tmp/gerrit-backup.tar.gz /var/gerrit/review_site
docker cp gerrit:/tmp/gerrit-backup.tar.gz .

# 恢复数据
docker cp gerrit-backup.tar.gz new_gerrit:/tmp/
docker exec new_gerrit tar xzf /tmp/gerrit-backup.tar.gz -C /

9. HTTPS配置

# 准备SSL证书
mkdir -p certs
# 将server.crt和server.key放入certs目录

docker run -d \
  --name gerrit \
  -p 443:8080 \
  -p 29418:29418 \
  -e CANONICAL_WEB_URL=https://your-domain.com \
  -e HTTP_LISTEN_URL=proxy-https://*:8080/ \
  -e SSL_CERT=/var/gerrit/etc/ssl/server.crt \
  -e SSL_KEY=/var/gerrit/etc/ssl/server.key \
  -v gerrit_data:/var/gerrit/review_site \
  -v $(pwd)/certs:/var/gerrit/etc/ssl:ro \
  gerritcodereview/gerrit:latest

三、快速启动脚本

#!/bin/bash
# quick-start-gerrit.sh

set -e

# 创建数据目录
mkdir -p gerrit_data

# 生成配置文件
cat > gerrit.config << 'EOF'
[gerrit]
  basePath = git
  canonicalWebUrl = http://localhost:8080/

[auth]
  type = DEVELOPMENT_BECOME_ANY_ACCOUNT

[sshd]
  listenAddress = *:29418

[httpd]
  listenUrl = http://*:8080/

[container]
  user = root
  javaHome = /usr/lib/jvm/java-11-openjdk
EOF

# 启动Gerrit
docker run -d \
  --name gerrit \
  --restart unless-stopped \
  -p 8080:8080 \
  -p 29418:29418 \
  -v $(pwd)/gerrit_data:/var/gerrit/review_site \
  -v $(pwd)/gerrit.config:/var/gerrit/etc/gerrit.config:ro \
  gerritcodereview/gerrit:latest

echo "Gerrit启动成功!"
echo "访问地址: http://localhost:8080"
echo "SSH地址: ssh://localhost:29418"

使用这些配置和解决方案,你应该能够顺利运行和管理Gerrit容器。如果在具体实施中遇到其他问题,可以查看容器日志获取更详细的错误信息。