先让镜像构建并返回可验证的页面

Docker 镜像构建成功,仍可能复制了错误文件,或运行后返回了错误页面。在 Bitbucket 流水线里加入仓库凭证和部署步骤前,先验证镜像是否返回预期内容。

下载完整示例、验证脚本和检查清单。

本例只使用一个静态 HTML 文件和 Nginx。我们在 2026 年 10 月 2 日运行了本地 Docker 检查。Bitbucket 配置依据 Atlassian 官方文档整理,尚未在 Bitbucket Cloud 工作区执行,也没有验证镜像推送或应用部署。

分清三个组成部分

流水线的步骤镜像提供执行脚本的工具;Docker service 提供构建和启动容器的守护进程;Dockerfile 描述待构建的应用镜像。修改其中一个,不会自动配置另外两个。

本例的 Dockerfile:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html

HTML 中放置 bitbucket-docker-smoke-ok 标记。.dockerignore 只允许 Dockerfile 和 index.html 进入构建上下文,避免带入无关仓库文件。用于自己的应用时,需要显式加入其他必要文件。

本地运行下载包

解压文件,启动 Docker,在解压目录打开终端:

python verify_local.py

脚本只依赖 Python 标准库和已安装的 Docker CLI。它创建唯一命名的测试镜像和容器,在容器内部请求 HTTP,并在退出时清理这些测试资源。整个过程不开放宿主机端口;下载的基础镜像和构建缓存可能保留。

实际执行的检查 结果 能说明什么 构建下载包中的 Dockerfile 通过 本地基础镜像和上下文可完成构建 请求 / 并查找标记 通过 容器内 Nginx 返回了指定 HTML 请求 /missing 按预期返回非零退出码 缺失路由能够被检测 构建复制 nonexistent.html 的 Dockerfile 按预期返回非零退出码 缺少 COPY 输入会使构建失败

测试环境为 Docker Desktop 4.81.0、Engine 29.6.1,Windows/WSL2 上的 Linux/amd64 容器。基础镜像本地 ID 为 sha256:4a73073bd557c65b759505da037898b61f1be6cbcc3c2c3aeac22d2a470c1752,它不是镜像仓库 manifest digest。下载包包含结果记录。这四项检查不构成速度对比或生产可靠性保证。

放进 Bitbucket 仓库

将包内 Dockerfile、index.html、.dockerignore 和 bitbucket-pipelines.yml 放进测试仓库根目录,启用 Pipelines 后提交。先确认工作区构建分钟额度。配置选择 Runtime v3,以 docker:27-cli 提供 CLI,并为构建步骤启用 Docker service。这些设置参考 Docker service 官方说明和 Runtime v3 官方说明。

脚本会构建以 commit 标识的镜像,启动容器,重试内部 HTTP 请求并检查标记,退出时清理容器。推送和部署属于后续单独验证的步骤。

包内 YAML 仍需一次真正的云端运行,才能检查工作区权限、镜像下载和 runner 环境。本地成功不代表云端已通过。两个镜像标签都可能变化;需要固定基础版本时,请在验证后锁定镜像仓库 digest。

按顺序定位失败

  1. docker version 看不到服务端时,先解决守护进程访问问题。
  2. COPY 失败时检查构建目录和 .dockerignore,参考 Docker 构建上下文说明。
  3. 容器退出时先读 docker logs,再检查 HTTP。
  4. HTTP 成功但缺少标记时检查文件和 URL;状态码不能证明返回了正确内容。
  5. 上述步骤正常后再加镜像仓库认证。使用受保护变量和 --password-stdin;不要在源码里放 token,也不要把发布凭证暴露给不可信的 pull request。

用来明确外包项目范围

本示例是独立编写的练习,不是客户系统的复刻。它可以帮助划分基础构建排障、镜像仓库、部署和应用专有配置的工作范围,不用于证明市场规模或已完成交易。其他动手验证的内容可在研究与文章列表中阅读。