GitLab容器适配docker-compose v1正常,v2启动失败循环重启问题排查
升级Docker Compose v1到v2后GitLab容器循环重启的解决方法
升级Docker Compose从v1到v2后,GitLab容器出现循环重启,日志重复提示数据库连接未配置的错误,而postgresql和redis容器均正常运行。
错误日志
gitlab_1 | ERROR: gitlab_1 | Please configure the database connection. gitlab_1 | Refer http://git.io/wkYhyA for more information. gitlab_1 | Cannot continue without a database. Aborting...
容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0fc7c9e5fed3 sameersbn/gitlab:13.12.4 "/sbin/entrypoint.sh…" About a minute ago Restarting (1) 42 seconds ago gitlab_gitlab_1 ca58e9c97153 sameersbn/postgresql:12-20200524 "/sbin/entrypoint.sh" About a minute ago Up About a minute 5432/tcp gitlab_postgresql_1 4799998c8ebb sameersbn/redis:latest "/sbin/entrypoint.sh" About a minute ago Up About a minute 6379/tcp gitlab_redis_1
环境版本
- Docker版本:18.06.3-ce, build d7080c1
- Docker-compose版本:1.28.5, build c4eb3a1f
原v1配置
postgresql: image: sameersbn/postgresql:12-20200524 restart: unless-stopped environment: - DB_USER=gitlab - DB_PASS=mypassword - DB_NAME=gitlabhq_production - DB_EXTENSION=pg_trgm,btree_gist volumes: - /etc/localtime:/etc/localtime:ro - /var/test/gitlab/postgresql_lib:/var/lib/postgresql - /var/test/gitlab/postgresql_run:/run/postgresql gitlab: image: sameersbn/gitlab:13.12.4 restart: unless-stopped links: - redis:redisio - postgresql:postgresql ports: - "22:22" environment: - GITLAB_BACKUP_DIR=/backups - GITLAB_HOST=gitlab.loc - GITLAB_PORT=80 - GITLAB_SSH_PORT=22 - GITLAB_SECRETS_DB_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_SECRET_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_OTP_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_EMAIL=gitlab@test.com - GITLAB_EMAIL_REPLY_TO=gitlab@test.com - GITLAB_TIMEZONE=Paris - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true - GITLAB_NOTIFY_PUSHER=true - VIRTUAL_HOST=gitlab.loc - VIRTUAL_PORT=80 volumes: - /etc/localtime:/etc/localtime:ro - /srv/backups/gitlab:/backups - /var/test/gitlab/home:/home/git/data redis: image: sameersbn/redis:latest restart: unless-stopped volumes: - /etc/localtime:/etc/localtime:ro
当前v2配置
version: "2.3" services: postgresql: image: sameersbn/postgresql:12-20200524 restart: unless-stopped environment: - DB_USER=gitlab - DB_PASS=mypassword - DB_NAME=gitlabhq_production - DB_EXTENSION=pg_trgm,btree_gist volumes: - /etc/localtime:/etc/localtime:ro - /var/test/gitlab/postgresql_lib:/var/lib/postgresql - /var/test/gitlab/postgresql_run:/run/postgresql gitlab: image: sameersbn/gitlab:13.12.4 restart: unless-stopped ports: - "22:22" environment: - GITLAB_BACKUP_DIR=/backups - GITLAB_HOST=gitlab.loc - GITLAB_PORT=80 - GITLAB_SSH_PORT=22 - GITLAB_SECRETS_DB_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_SECRET_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_OTP_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_EMAIL=gitlab@test.com - GITLAB_EMAIL_REPLY_TO=gitlab@test.com - GITLAB_TIMEZONE=Paris - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true - GITLAB_NOTIFY_PUSHER=true - VIRTUAL_HOST=gitlab.loc - VIRTUAL_PORT=80 volumes: - /etc/localtime:/etc/localtime:ro - /srv/backups/gitlab:/backups - /var/test/gitlab/home:/home/git/data redis: image: sameersbn/redis:latest restart: unless-stopped volumes: - /etc/localtime:/etc/localtime:ro
问题根源
Docker Compose v1的links选项会自动把链接容器的环境变量注入到当前容器,同时添加主机名映射;而v2的links仅做主机名映射,默认不再传递环境变量。你移除links后没有手动补充数据库和Redis的连接配置,导致GitLab无法获取数据库的认证信息,启动失败。
修复方案
方案1:手动添加数据库和Redis连接环境变量
在v2的gitlab服务的environment中补充以下配置,明确指定数据库和Redis的连接信息:
- DB_HOST=postgresql - DB_USER=gitlab - DB_PASS=mypassword - DB_NAME=gitlabhq_production - REDIS_HOST=redis
同时添加depends_on确保服务启动顺序:
depends_on: - postgresql - redis
方案2:保留links映射(兼容v2)
如果你想沿用原来的主机名(比如Redis用redisio),可以在gitlab服务中重新添加links,并配合depends_on:
links: - redis:redisio - postgresql:postgresql depends_on: - postgresql - redis
这样GitLab可以通过原来的主机名连接数据库和Redis,无需修改连接变量。
修改后的完整v2配置(方案1示例)
version: "2.3" services: postgresql: image: sameersbn/postgresql:12-20200524 restart: unless-stopped environment: - DB_USER=gitlab - DB_PASS=mypassword - DB_NAME=gitlabhq_production - DB_EXTENSION=pg_trgm,btree_gist volumes: - /etc/localtime:/etc/localtime:ro - /var/test/gitlab/postgresql_lib:/var/lib/postgresql - /var/test/gitlab/postgresql_run:/run/postgresql gitlab: image: sameersbn/gitlab:13.12.4 restart: unless-stopped ports: - "22:22" environment: - GITLAB_BACKUP_DIR=/backups - GITLAB_HOST=gitlab.loc - GITLAB_PORT=80 - GITLAB_SSH_PORT=22 - GITLAB_SECRETS_DB_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_SECRET_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_SECRETS_OTP_KEY_BASE=Secretxxxxxxxxxxxxxxxxxxxxxxxxxxx - GITLAB_EMAIL=gitlab@test.com - GITLAB_EMAIL_REPLY_TO=gitlab@test.com - GITLAB_TIMEZONE=Paris - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true - GITLAB_NOTIFY_PUSHER=true - VIRTUAL_HOST=gitlab.loc - VIRTUAL_PORT=80 # 新增数据库连接配置 - DB_HOST=postgresql - DB_USER=gitlab - DB_PASS=mypassword - DB_NAME=gitlabhq_production # 新增Redis连接配置 - REDIS_HOST=redis volumes: - /etc/localtime:/etc/localtime:ro - /srv/backups/gitlab:/backups - /var/test/gitlab/home:/home/git/data depends_on: - postgresql - redis redis: image: sameersbn/redis:latest restart: unless-stopped volumes: - /etc/localtime:/etc/localtime:ro
内容的提问来源于stack exchange,提问作者brennos legaulois
相关产品推荐
相关产品推荐

