GitLab流水线后续作业无法访问已安装包问题求助
GitLab CI流水线Docker构建推送故障排查与解决
错误原因
GitLab CI的每个作业都运行在独立的容器环境中,Prepare阶段安装的docker和awscli仅存在于该阶段的容器内。后续的Docker Login、Docker Build、Docker Push作业会启动全新的容器,自然找不到这些工具,从而抛出aws: not found、docker: not found错误。
解决方案
方案1:自定义预安装依赖的基础镜像(推荐)
制作包含python、docker-cli、awscli的自定义镜像,推送到你的镜像仓库(比如AWS ECR),让所有CI作业共享这个预配置的环境,避免重复安装。
- 创建自定义镜像的Dockerfile:
FROM python:3.11-alpine # 安装docker客户端和awscli RUN apk add --no-cache docker-cli RUN pip install awscli
- 构建并推送镜像到ECR:
docker build -t $AWS_ECR_REGISTRY/gitlab-ci-base:3.11-alpine . docker push $AWS_ECR_REGISTRY/gitlab-ci-base:3.11-alpine
- 修改
gitlab-ci.yaml使用自定义镜像:
stages: - login - build - push # 使用预安装依赖的自定义镜像 image: $AWS_ECR_REGISTRY/gitlab-ci-base:3.11-alpine variables: PROJECT_NAME: jenkins AWS_ECR_REPOSITORY: $AWS_ECR_REGISTRY/ecommerce_$PROJECT_NAME ENVIRONMENT: stage VERSION: 1.0.0 # 全局配置AWS凭证,所有作业执行前都会运行 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 region $AWS_REGION Docker Login: stage: login only: - stage - prod script: - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REGISTRY Docker Build: stage: build only: - stage - prod script: - docker build --build-arg ENVIRONMENT=$ENVIRONMENT -t $AWS_ECR_REPOSITORY:latest . - docker build --build-arg ENVIRONMENT=$ENVIRONMENT -t $AWS_ECR_REPOSITORY:$VERSION . Docker Push: stage: push only: - stage - prod script: - docker push $AWS_ECR_REPOSITORY:latest - docker push $AWS_ECR_REPOSITORY:$VERSION
方案2:全局Before Script统一安装依赖(快速临时解决)
如果暂时不想制作自定义镜像,可以在全局before_script中添加依赖安装步骤,让每个作业执行前自动安装所需工具:
stages: - login - build - push image: python:3.11-alpine variables: PROJECT_NAME: jenkins AWS_ECR_REPOSITORY: $AWS_ECR_REGISTRY/ecommerce_$PROJECT_NAME ENVIRONMENT: stage VERSION: 1.0.0 before_script: # 每个作业执行前安装依赖并配置AWS - apk add --no-cache docker - pip install awscli - 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 region $AWS_REGION Docker Login: stage: login only: - stage - prod script: - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REGISTRY Docker Build: stage: build only: - stage - prod script: - docker build --build-arg ENVIRONMENT=$ENVIRONMENT -t $AWS_ECR_REPOSITORY:latest . - docker build --build-arg ENVIRONMENT=$ENVIRONMENT -t $AWS_ECR_REPOSITORY:$VERSION . Docker Push: stage: push only: - stage - prod script: - docker push $AWS_ECR_REPOSITORY:latest - docker push $AWS_ECR_REPOSITORY:$VERSION
注:此方案会在每个作业中重复安装依赖,长期使用会浪费时间和资源,仅适合临时测试。
内容的提问来源于stack exchange,提问作者Alberto Sanmartin Martinez
相关产品推荐
相关产品推荐

