Dockerfile中FROM需为首指令,如何外部指定镜像仓库registry?
如何在Dockerfile外部指定镜像仓库
嘿,这个问题我之前也踩过坑,其实Docker官方文档里的规则有个实用的小例外——ARG是少数可以放在FROM之前的指令之一,刚好能完美解决你的需求!下面给你几个靠谱的实现方式:
方法1:在FROM前定义全局ARG(推荐)
你可以在Dockerfile最开头先声明ARG,然后直接在FROM里引用它,构建时通过--build-arg传入自定义仓库地址就行:
# 可以给ARG设置默认值,避免构建时没传参报错 ARG registry=docker.io FROM ${registry}/pipenv:latest # 后续的Dockerfile指令... RUN pipenv install --deploy --ignore-pipfile
构建时指定仓库:
docker build --build-arg registry=my-private-registry.com -t my-app .
这里要说明下:虽然官方说FROM必须是第一个构建阶段指令,但ARG作为全局参数声明,不属于构建阶段的执行指令,所以放在FROM之前是完全合规的,Docker会正确解析这个变量。
方法2:通过构建命令动态生成Dockerfile(适合临时场景)
如果不想修改现有Dockerfile,也可以在构建时直接通过shell拼接的方式传入仓库地址:
docker build --build-arg registry=my-custom-registry -f- . <<EOF FROM \${registry}/pipenv:latest # 把你原来Dockerfile里的内容复制到这里 RUN pipenv install --deploy --ignore-pipfile EOF
注意这里的\${registry}要加转义,避免shell提前解析变量。
方法3:用Docker Compose管理构建参数
如果你的项目用Docker Compose部署,可以在docker-compose.yml里直接配置构建参数,不用每次构建都敲长命令:
version: '3.8' services: my-app: build: context: . args: # 这里指定仓库地址,或者留空让外部传入 registry: my-private-registry.com dockerfile: Dockerfile # 其他服务配置...
对应的Dockerfile还是用方法1的写法就行,启动时直接docker-compose build就会自动传入参数。
内容的提问来源于stack exchange,提问作者blueFast
相关产品推荐
相关产品推荐

