docker镜像拉取策略不由dockerfile定义,而由运行时或编排工具控制,分cli、compose、kubernetes三层:cli用--pull参数,compose用pull_policy字段,kubernetes用imagepullpolicy字段,且标签选择(如latest vs语义化版本)直接影响默认拉取行为。

Docker 镜像拉取策略不是写在 Dockerfile 里,而是由运行时环境或编排工具决定的——它控制的是“什么时候、从哪、要不要拉新镜像”,而不是“怎么构建”。
你设拉取策略的地方主要有三个层级:命令行、Compose 文件、Kubernetes Pod 配置。不同场景用不同方式。
Docker CLI 拉取时的策略控制
直接用 docker pull 或 docker run 时,拉取行为由参数和本地状态决定:
-
docker pull nginx:1.25→ 仅当本地没有该 tag 才拉(默认行为) -
docker pull --quiet nginx:1.25→ 静默拉取,不输出进度 -
docker run --pull=always nginx:1.25→ 强制每次拉最新(跳过本地缓存) -
docker run --pull=missing nginx:1.25→ 本地没这个镜像才拉(等价于默认)
注意:--pull=never 不会拉镜像,但若本地不存在,容器启动失败。
Docker Compose 中设置 pull_policy
在 docker-compose.yml 的 service 下指定,支持五种策略:
-
ifnotpresent:本地没有才拉(开发/测试常用,安全稳定) -
always:每次启动都拉最新(适合生产环境强制更新) -
never:完全不拉,只用本地已有镜像(离线部署必备) -
build:优先执行build:步骤,构建完再用(适合本地开发调试) -
refresh=12h:本地镜像超过 12 小时就检查远程是否有更新(需 daemon 支持)
示例:
services:
app:
image: my-registry.example.com/app:v2.3
pull_policy: ifnotpresent
cache:
image: redis:7.2-alpine
pull_policy: "refresh=24h"
Kubernetes 中通过 imagePullPolicy 控制
在 Pod 或 Deployment 的 container 字段中设置,只有三个可选值:
-
Always:无论本地有没有,都尝试拉取(适用于:latest标签) -
IfNotPresent:本地存在就不拉(推荐用于带明确版本号的镜像,如v1.2.0) -
Never:只用本地镜像,不联网拉取(常用于 air-gapped 环境)
Kubernetes 默认规则是:
- 镜像 tag 是
latest→ 默认imagePullPolicy: Always - 其他 tag(如
1.2,v2.0.1)→ 默认IfNotPresent
你可以在 YAML 中显式覆盖:
containers: - name: frontend image: harbor.internal/app:1.8.3 imagePullPolicy: IfNotPresent
额外提一句:镜像标签本身影响拉取逻辑
用 :latest 标签本质上是“放弃版本确定性”——它不等于“最新稳定版”,而是一个可能被反复覆盖的指针。生产环境强烈建议用语义化版本(如 nginx:1.25.4-alpine),配合 IfNotPresent 或 Never,避免意外升级导致兼容性问题。
不复杂但容易忽略。











