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
相关产品推荐
相关产品推荐

