Skip to main content
[ PIER ]

Dockerfile

粘贴 Dockerfile(或指向 Git 仓库)—— Pier 构建并发布。

Application #docker#build#dockerfile

带上你自己的 Dockerfile,Pier 构建镜像、运行容器并连接它。直接粘贴 Dockerfile 或指向包含一个的 Git 仓库。当你需要自动构建器(Railpack)无法表达的完整构建控制 —— 异国系统包、多阶段构建、自定义入口点 —— 时有用。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 Dockerfile。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。

什么是 Dockerfile 模板?

带上你自己的 Dockerfile。要么直接粘贴到 Pier UI(对微小的内联容器有用), 要么指向包含一个的 Git 仓库(对你将迭代的一切有用)。Pier 用 BuildKit 构建镜像、运行容器、将其附加到其 Traefik 前置网络以获得 HTTPS,并管理 env / 卷 / 日志 / 生命周期。

当你需要对构建的显式控制 —— 多阶段构建、distroless 基础镜像、系统包、自定义 入口点、构建时秘密 —— 而自动构建器如 Railpack 不公开时使用本模板。手工调优的 Dockerfile 始终在镜像大小、层控制和针对特定应用的安全审查表面上击败自动构建器。

Pier 如何部署它

你提供 Dockerfile 内容(文本区域)或 Git URL。Pier 克隆(如果 Git 模式)并 在主机上运行 docker buildx build 带 BuildKit,产生本地存储的 OCI 镜像。 容器用你配置的端口、env vars 和卷启动。

BuildKit 层缓存在构建之间持久化 —— 典型增量构建在几秒内完成。构建秘密(npm token、私有注册表 auth)通过 BuildKit 的秘密挂载机制一起传输,而不烘焙到 最终镜像中。

在 Pier 中附加自定义域名以通过 Traefik 获得 HTTPS。单击 Redeploy 触发重新 构建(或为推送部署连接 Git webhook)。

何时不要使用 Dockerfile

对于”我有源代码,没有 Dockerfile,想要容器” —— 使用 Railpack。对于 “我在注册表中有预构建镜像” —— 使用 Docker 镜像。对于”我有多容器栈” —— 使用 Docker Compose。对于带托管备份和版本升级的原生 Pier 服务(PostgreSQL、 Gitea、Grafana 等),选择专用模板。Dockerfile 是当你需要完全控制单容器 应用的构建方式时的正确答案。

核心功能

内联粘贴或 Git URL

两种输入模式 —— 将 Dockerfile 直接粘贴到 UI 中,或给 Pier 仓库 URL,它从仓库根目录(或指定路径)的 Dockerfile 构建。

完整构建控制

多阶段构建、ARG / ENV / COPY / RUN —— Docker 能做的任何事,本模板构建。

BuildKit 驱动

跨重新构建的层缓存、并行阶段、构建秘密。比经典 Docker 构建更快的迭代。

构建参数 + env vars

单独传递构建时 ARG 和运行时 ENV。构建秘密保留在最终镜像之外。

通过 Traefik 的 HTTPS

在 Pier 中附加域名;运行容器自动用 Let's Encrypt TLS 前置。

Webhook redeploy

指向 Git 仓库时,配置 webhook 以便每次推送触发重新构建和 redeploy。

应用场景

当 Railpack 不够时

你需要系统包、自定义基础镜像、多阶段构建或 Railpack 不自动检测的构建技巧。编写 Dockerfile。

带手工调优 Dockerfile 的遗留应用

你现有的 Dockerfile 反映了多年的构建调优 —— 保留它,通过 Pier 发布。

严格的镜像控制

你想要特定的基础镜像(distroless、scratch、Alpine)、特定的用户、特定的层顺序 —— Dockerfile 是唯一的方法。

带秘密的构建

BuildKit 秘密保持凭证不在最终镜像中。Dockerfile 模板支持它们;Railpack 和镜像不。

单文件实用容器

微小脚本、init 容器、sidecar —— 内联粘贴 10 行 Dockerfile,部署。

代码示例

最小 Node.js Dockerfile(内联粘贴) dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
多阶段 Go 构建(约 10 MB 镜像) dockerfile
FROM golang:1.23 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/server ./cmd/server

FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/server /server
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/server"]
带系统包的 Python dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
      ffmpeg libsndfile1 \
  && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
BuildKit 秘密(npm 私有注册表 token) dockerfile
# syntax=docker/dockerfile:1
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN --mount=type=secret,id=npm_token \
    export NPM_TOKEN=$(cat /run/secrets/npm_token) && \
    echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc && \
    npm ci --omit=dev && \
    rm ~/.npmrc
COPY . .
CMD ["node", "server.js"]

对比

vs Railpack(本目录) Railpack 自动检测并为你编写构建计划。Dockerfile 是当你需要显式控制或 Railpack 的检测不正确时。许多团队从 Railpack 开始,并将需要它的特定服务移到 Dockerfile。
vs Docker 镜像(本目录) Docker 镜像运行预构建镜像。Dockerfile 从源代码构建镜像。当 CI 为你构建时使用镜像;想要 Pier 构建时使用 Dockerfile。
vs Docker Compose(本目录) Compose 编排多个容器。Dockerfile 构建和运行一个。使用 Compose 用于多服务栈(它也可以按服务从 Dockerfile 构建)。
vs Buildpacks (CNB) CNB 是 Heroku/Paketo 风格构建器背后的规范。Railpack 是 Pier 上更简单的现代替代。Dockerfile 是较低级的逃生舱口。

常见问题

从 Git 仓库 URL 或内联粘贴 —— 选哪个?
内联用于微小测试容器和一次性。Git URL 用于你将迭代的一切 —— 推送到仓库、redeploy。
我的上下文能多大?
构建上下文上传到 Pier —— 保持适度。积极使用 .dockerignore。大上下文减慢构建。
BuildKit 缓存?
BuildKit 层缓存位于 Pier 主机上。重复构建基于 COPY 哈希重用层。增量代码更改上典型 80%+ 缓存命中。
多架构构建?
Pier 为主机架构构建。对于多架构镜像,在 CI(你可以 buildx 的地方)构建并通过 Docker 镜像模板发布。
私有基础镜像?
在 Pier Settings → Registries 中添加注册表凭证 —— 它们用于 FROM 拉取和镜像推送。
构建秘密如何工作?
在 Pier UI 中添加秘密,通过 --mount=type=secret,id=NAME 在 Dockerfile 中引用。BuildKit 保持它不在最终层中。
Webhook redeploy?
如果使用 Git URL 模式,在 Pier 中生成 webhook URL 并将其添加到你的 Git 主机。每次推送触发重新构建和上线。

相关服务

在你的 VPS 上部署

带上你自己的 Dockerfile,Pier 构建镜像、运行容器并连接它。直接粘贴 Dockerfile 或指向包含一个的 Git 仓库。当你需要自动构建器(Railpack)无法表达的完整构建控制 —— 异国系统包、多阶段构建、自定义入口点 —— 时有用。

部署此服务 →