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

GitLab CI/CD流水线执行时Docker命令未找到问题求助

问题:Docker命令未找到,无法将Next.js应用部署至AWS ECS

错误日志

λ (服务器端)运行时进行服务器端渲染(使用getInitialProps或getServerSideProps)
○ (静态)自动渲染为静态HTML(不使用初始属性)
● (SSG)自动生成为静态HTML+JSON(使用getStaticProps)
$ echo "Building the Docker image..."
Building the Docker image...
$ docker build -t $IMAGE_TAG .
/bin/sh: eval: 第163行: docker: 未找到

清理项目目录及基于文件的变量
00:00
ERROR: 作业失败:退出码127

问题原因

你的GitLab CI配置存在两个核心问题:

  • 全局before_script包含Docker命令,但部分Job的镜像无Docker环境:全局before_script里执行了docker --version和docker info,但test阶段用的node:latest镜像、deploy阶段用的amazon/aws-cli镜像都没有预装Docker,执行这些命令时直接触发"未找到"错误。
  • 冗余的Docker服务配置:test阶段仅需执行Node.js相关测试,不需要Docker环境,但仍配置了docker:dind服务,属于无效配置。

修复方案

修改gitlab-ci.yml,拆分全局before_script,仅在需要Docker的Job中保留Docker相关命令,其他Job单独配置适配自身环境的前置脚本:

image: docker:20.10.7 # 全局默认镜像,仅build阶段会用到

services:
  - docker:20.10.7-dind # 全局默认服务,仅build阶段会用到

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: 'my-repository'
  AWS_DEFAULT_REGION: eu-central-1
  AWS_ECR_REGISTRY: 767397666295.dkr.ecr.eu-central-1.amazonaws.com
  AWS_ECR_REPOSITORY: my-repository
  ECS_CLUSTER: my-cluster
  ECS_SERVICE: my-service
  ECS_TASK_DEFINITION: my-task-def

# 移除全局before_script,改为给每个Job单独配置

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker --version
    - docker info
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set default.region $AWS_DEFAULT_REGION
  script:
    - docker version # 验证Docker已安装并运行
    - docker info
    - docker build -t $DOCKER_IMAGE:$CI_COMMIT_SHA .
    - docker tag $DOCKER_IMAGE:$CI_COMMIT_SHA $AWS_ECR_REGISTRY/$AWS_ECR_REPOSITORY:$CI_COMMIT_SHA
    - docker push $AWS_ECR_REGISTRY/$AWS_ECR_REPOSITORY:$CI_COMMIT_SHA

test:
  stage: test
  image: node:latest
  # 移除不必要的docker:dind服务
  before_script:
    - npm --version # 验证Node环境
  script:
    - npm install
    - npm run test

deploy:
  stage: deploy
  image: amazon/aws-cli
  before_script:
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set default.region $AWS_DEFAULT_REGION
    - aws --version # 验证AWS CLI环境
  script:
    - aws ecs update-service --cluster $ECS_CLUSTER --service $ECS_SERVICE --task-definition $ECS_TASK_DEFINITION --force-new-deployment

额外优化建议

  • 固定镜像版本:避免使用latest标签(如docker:latest、node:latest),改用具体版本号(如docker:20.10.24、node:18-alpine),提升CI执行的稳定性。
  • Dockerfile多阶段构建:减小最终镜像体积,优化部署效率:
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ARG NEXT_PUBLIC_BASE_URL=""
RUN npm run build

# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
RUN npm install --production
EXPOSE 3000
CMD ["npm", "start"]

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:37:11