Docker Compose部署Keycloak启动失败:文件或目录不存在
问题:Keycloak容器启动失败,提示找不到kc.sh文件
启动docker-compose.yaml时,Postgres可正常启动,但Keycloak启动失败,报错信息如下:
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/opt/keycloak/bin/kc.sh ": stat /opt/keycloak/bin/kc.sh : no such file or directory: unknown
启用交互式终端、将ENTRYPOINT改为bash后手动执行/opt/keycloak/bin/kc.sh start-dev,Keycloak可正常启动;尝试将Dockerfile中的ENTRYPOINT设为/opt/keycloak/bin/kc.sh start-dev并移除compose.yaml中的command,问题依旧。
问题根源
你的Keycloak Dockerfile中,ENTRYPOINT的路径末尾多了一个空格:
ENTRYPOINT ["/opt/keycloak/bin/kc.sh "]
Docker会严格按照这个带空格的路径查找文件,但实际文件路径是/opt/keycloak/bin/kc.sh(无末尾空格),因此提示文件不存在。
修复方案
修改Dockerfile中的ENTRYPOINT,去掉路径末尾的空格:
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
修改后,compose.yaml中的command: - start-dev会和ENTRYPOINT正常组合,执行/opt/keycloak/bin/kc.sh start-dev命令,Keycloak即可正常启动。
附:用户提供的原始配置文件
Keycloak Dockerfile
FROM quay.io/keycloak/keycloak:latest as builder # Enable health and metrics support ENV KC_HEALTH_ENABLED=true ENV KC_METRICS_ENABLED=true # Configure a database vendor ENV KC_DB=postgres WORKDIR /opt/keycloak # for demonstration purposes only, please make sure to use proper certificates in production instead RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:keycloak,IP:127.0.0.1" -keystore conf/server.keystore RUN /opt/keycloak/bin/kc.sh build FROM quay.io/keycloak/keycloak:latest COPY --from=builder /opt/keycloak/ /opt/keycloak/ # change these values to point to a running postgres instance ENV KC_DB=postgres ENV KC_DB_URL=jdbc:postgresql://snc-postgres:5432/keycloak ENV KC_DB_USERNAME=localdevuser ENV KC_DB_PASSWORD=password1 ENV KC_HOSTNAME=keycloak ENTRYPOINT ["/opt/keycloak/bin/kc.sh "]
compose.yaml
name: snc-infrastructure services: snc-postgres: image: me/postgres secrets: - db-password build: context: ./postgres dockerfile: Dockerfile tags: - "me/postgres:latest" healthcheck: test: [ "CMD", "pg_isready", "-q", "-U", "localdevuser", "-d", "keycloak" ] interval: 10s volumes: - type: volume source: postgres-snc target: /var/lib/postgresql/data networks: - snc-network environment: - POSTGRES_PASSWORD_FILE=/run/secrets/db-password container_name: snc-postgres ports: - target: 5432 published: 5432 protocol: tcp mode: host snc-keycloak: image: me/keycloak:latest build: context: ./keycloak dockerfile: Dockerfile tags: - "me/keycloak:latest" # stdin_open: true # docker run -i # tty: true # docker run -t depends_on: snc-postgres: condition: service_healthy environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin command: - start-dev ports: - "8080:8080" - "8001:8001" networks: - snc-network volumes: postgres-snc: name: postgres-snc secrets: db-password: file: ./postgres/password.txt networks: snc-network:
内容的提问来源于stack exchange,提问作者Timothy Vogel
相关产品推荐
相关产品推荐

