Bitbucket Pipeline运行docker-compose build无报错失败排查
Bitbucket Pipelines docker-compose构建静默失败排查与修复
现有配置
当前使用的bitbucket-pipelines.yml配置如下:
image: python:3.7.4-alpine3.10 pipelines: tags: ecr-release-*: - step: services: - docker caches: - pip script: - pip3 install awscli - pip3 install docker - pip3 install docker-compose - IMAGE="983344321808.dkr.ecr.us-west-2.amazonaws.com/cicd" - TAG=${BITBUCKET_BRANCH:-$BITBUCKET_TAG} - aws configure set aws_access_key_id "AKIA6J47DSUIAZH466UH" - aws configure set aws_secret_access_key "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" - eval $(aws ecr get-login --no-include-email --region us-east-1 | sed 's;https://;;g') - docker-compose -f docker-compose-dev.yml build # - docker push $IMAGE:$TAG
故障现象:Pipeline执行到docker-compose构建步骤时直接退出,控制台无明确错误信息。
故障根因
- 基础依赖缺失:使用的
python:3.7.4-alpine3.10是精简版Alpine镜像,默认不带gcc、musl-dev、libffi-dev、openssl-dev等编译依赖,pip安装docker-compose时需要编译C扩展,缺依赖时安装过程可能无显性报错,但运行时会直接崩溃退出;同时镜像默认不带docker-cli组件,pip安装的docker模块无法正常调用挂载的docker.sock,会直接静默失败。 - ECR登录区域不匹配:镜像仓库属于
us-west-2区域,但登录ECR时指定的是us-east-1,即便docker-compose正常运行,后续拉取/推送镜像也会出现权限错误。 - 无调试日志:docker-compose build默认日志级别较低,出现底层错误时不会输出详细信息,难以定位问题。
- 额外风险:配置中硬编码了AWS访问密钥,存在严重的密钥泄露风险,任何人只要能访问仓库代码都能拿到密钥操作对应AWS资源。
修复方案
修正后的完整配置
image: python:3.7.4-alpine3.10 pipelines: tags: ecr-release-*: - step: services: - docker caches: - pip script: # 安装系统层面的编译、运行依赖 - apk add --no-cache gcc musl-dev libffi-dev openssl-dev docker-cli # 批量安装python依赖,减少冗余执行步骤 - pip3 install --no-cache-dir awscli docker docker-compose # 提前校验docker服务连通性 - docker info - IMAGE="983344321808.dkr.ecr.us-west-2.amazonaws.com/cicd" - TAG=${BITBUCKET_BRANCH:-$BITBUCKET_TAG} # 建议将AK/SK配置为Bitbucket仓库级安全变量,不要硬编码在配置文件中 - aws configure set aws_access_key_id "$AWS_ACCESS_KEY_ID" - aws configure set aws_secret_access_key "$AWS_SECRET_ACCESS_KEY" # 修正ECR登录区域为仓库实际所在的us-west-2,使用更稳定的新版登录命令 - aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin "$IMAGE" # 增加--verbose参数输出详细构建日志,方便后续排查问题 - docker-compose -f docker-compose-dev.yml build --verbose # - docker push $IMAGE:$TAG
调整说明
- 执行pip安装前先通过apk安装Alpine系统依赖,解决python包编译、docker调用的基础环境问题
- 增加
docker info前置校验步骤,在执行构建前先确认docker服务连通性正常,提前暴露问题 - 修正ECR登录区域和镜像仓库区域一致,替换旧版
get-login命令为更稳定的get-login-password方式,避免旧命令兼容性问题 - 给docker-compose build增加
--verbose参数,输出详细构建日志,后续如果再出问题可以直接从日志定位根因 - 移除硬编码的AWS密钥,替换为Bitbucket提供的安全变量,避免密钥泄露
内容的提问来源于stack exchange,提问作者Kiran S youtube channel
相关产品推荐
相关产品推荐

