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

GitLab CI/CD拉取镜像后docker-compose无法运行问题求助

问题分析

你的CI/CD流程中最后一步docker compose up执行失败,核心问题集中在这几点:

  1. SSH命令格式错误:前两条SSH命令未通过-i指定私钥文件,且GitLab CI中直接引用$SSH_PRIVATE_KEY变量无法被SSH识别为私钥路径,必须先将私钥写入文件并设置权限。
  2. 容器编排逻辑混乱:你先用docker run单独启动项目容器,又试图用docker compose启动Redis,两者网络环境不一致(项目用host网络,Redis用默认bridge网络),且docker-compose.yml未包含项目服务,无法实现统一编排。
  3. docker compose up未后台运行:该命令默认前台执行,会导致CI任务阻塞超时,最终失败。
解决方案

1. 更新docker-compose.yml,统一编排项目与Redis服务

修改配置文件,加入你的项目服务,统一网络配置(建议用compose默认网络,避免host网络的兼容性问题):

version: "3.2"

services:
  app:
    image: $DOCKER_IMAGE  # 对应CI中的项目镜像变量
    container_name: $CI_PROJECT_NAME
    restart: always
    volumes:
      - "/app/storage:/src/storage"
    depends_on:
      redis:
        condition: service_healthy  # 等待Redis健康检查通过后再启动项目
    networks:
      - app-network

  redis:
    image: redis:latest
    volumes:
      - redisdata:/data/
    command: --port 6379
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

volumes:
  redisdata:

networks:
  app-network:
    driver: bridge

2. 修正gitlab-ci.yml的deploy步骤

调整SSH命令格式,处理私钥权限,并用docker compose统一启动所有服务:

image: node:latest

stages:
  - build
  - deploy

build:
  image: docker:stable
  services:
    - docker:dind
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
    - docker build --pull -t "$DOCKER_IMAGE" .
    - docker push "$DOCKER_IMAGE"

deploy:
  stage: deploy
  before_script:
    # 将SSH私钥写入临时文件并设置权限
    - echo "$SSH_PRIVATE_KEY" > /tmp/id_rsa
    - chmod 600 /tmp/id_rsa
    # 禁用主机密钥检查,避免CI交互
    - echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config
  script:
    # 登录目标服务器的GitLab镜像仓库
    - ssh -i /tmp/id_rsa $USER_NAME@$HOST_NAME "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    # 将本地的docker-compose.yml传到目标服务器(假设目标路径为/app)
    - scp -i /tmp/id_rsa docker-compose.yml $USER_NAME@$HOST_NAME:/app/
    # 进入目标目录,后台启动所有服务
    - ssh -i /tmp/id_rsa $USER_NAME@$HOST_NAME "cd /app && docker compose up -d"

关键说明

  • 私钥处理:GitLab CI中存储的SSH_PRIVATE_KEY是字符串,必须写入文件并设置600权限才能被SSH识别。
  • 依赖等待:通过depends_on配合service_healthy,确保Redis完全启动后再启动项目服务,避免项目启动时Redis未就绪的问题。
  • 网络统一:使用compose自定义网络,项目容器和Redis容器可以通过服务名(redis)互相访问,无需暴露端口到主机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:41:34