Bitbucket Pipeline中Docker容器超时崩溃问题求助
我正在搭建同时使用docker-compose和Semgrep的Bitbucket Pipeline,但在任何含Semgrep的镜像上都无法正常运行Docker。所用基于Semgrep的工具已有容器化版本,尝试全容器方案后,容器运行1分30秒左右就超时崩溃,错误日志如下:
docker run -v $(pwd):/mnt --env "NIGHTVISION_TOKEN=$NIGHTVISION_TOKEN" --add-host=localhost:172.17.0.1 alexnightvision/nightvision-cli nightvision scan -t javaspringvulny-api -a javaspringvulny-api --auth javaspringvulny-api
1m 39s
- docker run -v $(pwd):/mnt --env "NIGHTVISION_TOKEN=$NIGHTVISION_TOKEN" --add-host=localhost:172.17.0.1 alexnightvision/nightvision-cli nightvision scan -t javaspringvulny-api -a javaspringvulny-api --auth javaspringvulny-api
[2024-04-15 15:30:51] INFO Launching NightVision CLI
[2024-04-15 15:30:53] INFO Starting an OpenAPI Scan
[2024-04-15 15:30:55] INFO Assigned relay ID relayId=NV0RLY01HVH63YPHW3MZ1H4WYZTR2RJM
46950926-7c99-497f-ad68-849495288607
[2024-04-15 15:30:56] INFO Scan initiated 🚀
[2024-04-15 15:30:56] INFO Scan Details:
info=
│ Login Status: PENDING
│ Status: RUNNING
│ Progress: 0.00%
[2024-04-15 15:31:01] INFO Scanning in progress
...(中间扫描日志省略)
[2024-04-15 15:32:29] INFO Scanning in progress
time="2024-04-15T15:32:30Z" level=error msg="error waiting for container: unexpected EOF"
解决方向
1. 延长Pipeline步骤超时时间
Bitbucket Pipeline单步默认超时10分钟,若扫描任务本身耗时较长,或资源不足导致进程变慢,可在bitbucket-pipelines.yml中为对应步骤设置更长超时:
pipelines: default: - step: name: NightVision扫描 script: - docker run ... # 你的容器命令 timeout: 30 # 单位为分钟,按需调整
2. 增加Pipeline资源配额
Bitbucket Runner默认CPU和内存有限,若扫描任务资源占用高,容器可能因资源不足被强制终止。可在步骤中配置更多资源:
pipelines: default: - step: name: NightVision扫描 script: - docker run ... resources: cpu: 2 # 分配2核CPU memory: 4096 # 分配4GB内存
3. 修复Docker嵌套运行的权限问题
若Semgrep镜像未正确配置Docker权限,会导致容器内Docker命令执行异常。可:
- 使用Bitbucket官方镜像(如
atlassian/default-image:3)作为基础镜像,该镜像已配置好Docker运行环境 - 在步骤中启用Docker服务:
pipelines: default: - step: name: NightVision扫描 services: - docker script: - docker run ...
4. 排查容器输出流中断问题
unexpected EOF错误常因容器进程输出流中断导致,可尝试:
- 在
docker run命令中添加-t参数分配伪终端,或--log-driver json-file指定日志驱动 - 将容器日志重定向到文件,排查异常输出:
docker run ... > scan.log 2>&1 cat scan.log
5. 放弃嵌套容器,直接安装工具
若全容器方案问题过多,可直接在Pipeline步骤中安装Semgrep和NightVision CLI,避免Docker嵌套的复杂性:
pipelines: default: - step: name: Semgrep+NightVision扫描 image: python:3.11 script: - pip install semgrep nightvision-cli - nightvision scan -t javaspringvulny-api -a javaspringvulny-api --auth javaspringvulny-api
内容的提问来源于stack exchange,提问作者Alex Cohen

