Bitbucket CI/CD流水线中如何正确执行curl并完成Docker容器测试
解决Bitbucket流水线Docker步骤卡住的问题
问题原因
你的docker run命令默认以前台模式运行容器,会占用当前脚本的执行进程,导致后续的echo、curl命令无法执行,流水线步骤一直处于“运行中”状态。
修改方案
方案1:后台启动容器,完成测试后清理容器
修改script部分代码,通过-d参数让容器后台运行,释放脚本进程,之后执行测试操作,最后停止并删除容器:
script: # 后台启动容器,记录容器ID - CONTAINER_ID=$(docker run -d -p 8080:8080 -e DVC_BEARER_TOKEN=$(gcloud auth print-access-token) -e MODEL_DIR="model_checkpoints/$MODEL_TYPE/$CUSTOMER/" $IMAGE) # 等待服务启动(可根据实际情况调整时长) - sleep 10 - echo "RUN SUCCESSFULLY" - curl http://localhost:8080/ # 测试完成后停止并删除容器 - docker stop $CONTAINER_ID - docker rm $CONTAINER_ID
方案2:后台启动+自动删除容器
添加--rm参数,容器停止后会自动删除,省去手动删除步骤:
script: - CONTAINER_ID=$(docker run -d --rm -p 8080:8080 -e DVC_BEARER_TOKEN=$(gcloud auth print-access-token) -e MODEL_DIR="model_checkpoints/$MODEL_TYPE/$CUSTOMER/" $IMAGE) - sleep 10 - echo "RUN SUCCESSFULLY" - curl http://localhost:8080/ - docker stop $CONTAINER_ID
优化:智能等待服务启动
固定sleep时长可能不够可靠,可改用循环检查的方式,直到服务响应再执行后续操作:
script: - CONTAINER_ID=$(docker run -d --rm -p 8080:8080 -e DVC_BEARER_TOKEN=$(gcloud auth print-access-token) -e MODEL_DIR="model_checkpoints/$MODEL_TYPE/$CUSTOMER/" $IMAGE) # 循环curl直到服务响应,每次间隔2秒 - until curl -s http://localhost:8080/; do sleep 2; done - echo "RUN SUCCESSFULLY" - curl http://localhost:8080/ - docker stop $CONTAINER_ID
内容的提问来源于stack exchange,提问作者Ololo
相关产品推荐
相关产品推荐

