You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab Runner中Docker Compose容器崩溃:无写入权限问题排查

GitLab环境中Keycloak容器启动崩溃排查

问题描述

在GitLab环境使用Docker Runner构建用于测试的Keycloak容器镜像,通过Docker Compose挂载./data:/opt/keycloak/data/目录预配置数据,但容器启动后崩溃。该配置在本地机器运行正常,仅GitLab环境出现问题。

流水线配置

build-keycloak-test-image:
  stage: build-keycloak-test-image
  before_script:
    - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
    - apk add --no-cache curl
    - chmod +x ./keycloak/test/build.sh
  script:
    - cd ./keycloak/test/
    - sh ./build.sh
    - docker push $KEYCLOAK_TEST_IMAGE
  only:
    - tags

构建脚本

#!/bin/bash
KEYCLOAK_URL="${KEYCLOAK_TEST_GEN_URL:-http://localhost:8889}"
HEALTH_ENDPOINT="/health"

rm -fr ./data/*
mkdir ./data
chmod -R 777 ./data/
docker compose up -d
# ...

容器启动日志

2024-09-13 15:07:03,053 INFO  [org.keycloak.common.Profile] (main) Preview features enabled: token-exchange
2024-09-13 15:07:12,589 INFO  [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 10289ms
...(省略重复日志)
2024-09-13 15:07:23,912 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) For more details run the same command passing the '--verbose' option. Also you can use '--help' to see the details about the usage of the particular command.

Docker Compose配置

services:
  keycloak:
    image: quay.io/keycloak/keycloak:23.0.6
    ports:
      - "8889:8080"
    command:
      - start-dev
    volumes:
      - ./data:/opt/keycloak/data/
    environment:
      KEYCLOAK_ADMIN: "admin"
      KEYCLOAK_ADMIN_PASSWORD: "mypass"
      KC_HEALTH_ENABLED: true
      KC_METRICS_ENABLED: true
      KC_HOSTNAME_STRICT: false
      KC_HTTP_ENABLED: false
      KC_FEATURES: "token-exchange"
      PROXY_ADDRESS_FORWARDING: true
    networks:
      - gitlab
      - default
networks:
  gitlab:
    name: gitlab-network

观察结果

脚本会创建data目录并设置777权限,Git Runner环境中该目录属主为root:

# ls /builds/dev/project/keycloak/test/ -lah
total 24K
drwxrwxrwx    3 root     root        4.0K Sep 13 15:06 .
drwxrwxrwx    7 root     root        4.0K Sep  4 12:56 ..
...
drwxrwxrwx    2 root     root        4.0K Sep 13 15:06 data

问题原因及解决方案

1. HTTP配置冲突

Docker Compose中设置了KC_HTTP_ENABLED: false,但start-dev模式默认依赖HTTP端口(8080)提供服务,且未配置HTTPS证书,导致Keycloak无法启动监听端口,直接崩溃。

解决:
修改环境变量,启用HTTP:

KC_HTTP_ENABLED: true

2. 挂载目录权限映射问题

GitLab Runner中创建的data目录属主为root,而Keycloak容器默认使用非root用户(uid=1000)运行。即使设置了777权限,部分环境的安全策略(如SELinux、容器用户权限限制)会阻止非root用户写入root属主的目录。

解决:
在构建脚本中添加属主修改命令,将data目录的属主改为容器内Keycloak用户的uid:

rm -fr ./data/*
mkdir ./data
chmod -R 777 ./data/
chown -R 1000:1000 ./data/  # 新增这一行
docker compose up -d

3. 启用详细日志排查

当前日志未提供具体错误细节,建议在Docker Compose的command中添加--verbose参数,获取更详细的启动错误信息:

command:
  - start-dev
  - --verbose

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:48:11