如何使用docker-compose基于现有镜像构建带参数指定配置的衍生镜像
实现方案
下面是完全符合你需求的实现方式,无需挂载配置,生成的镜像可直接运行,后续更新配置只需重新构建即可:
方案一:docker-compose + Dockerfile 实现
步骤1:创建Dockerfile
在项目根目录新建Dockerfile,内容如下:
# 基于公司通用pepsr基础镜像 FROM pepsr # 接收构建传入的环境名称参数 ARG INSTALL_NAME # 复制对应环境的配置文件到容器指定路径 COPY ${INSTALL_NAME}.installation.config.json installation.config.json
步骤2:创建docker-compose.yml
在项目根目录新建docker-compose.yml,内容如下:
version: '3.8' services: pepsr: build: context: . args: - INSTALL_NAME=${INSTALL_NAME} # 生成的镜像名称按规则拼接 image: pepsr-${INSTALL_NAME}
步骤3:编写makeRelease.sh脚本
#!/bin/bash # 参数校验 if [ $# -ne 1 ]; then echo "用法:./makeRelease <环境名称>" exit 1 fi # 导出环境变量供docker-compose读取 export INSTALL_NAME=$1 # 执行构建,--no-cache确保每次构建都拉取最新配置 docker-compose build --no-cache # 若需自动推送镜像到内部仓库可放开下面这行 # docker-compose push
使用方式
将所有环境的配置文件(如harvard.installation.config.json)放在项目根目录,执行./makeRelease harvard即可自动生成pepsr-harvard镜像。
方案二:轻量脚本实现(无需额外维护compose和Dockerfile)
如果不想维护多余的配置文件,可以直接用单行构建命令封装脚本,makeRelease.sh内容如下:
#!/bin/bash if [ $# -ne 1 ]; then echo "用法:./makeRelease <环境名称>" exit 1 fi INSTALL_NAME=$1 # 直接通过标准输入传入Dockerfile内容完成构建 docker build -t pepsr-${INSTALL_NAME} -f- . <<EOF FROM pepsr COPY ${INSTALL_NAME}.installation.config.json installation.config.json EOF
两种方案均满足你的要求:
- 生成的镜像为全集成版本,无需额外挂载配置,直接拉取即可运行
- 后续更新配置只需替换对应环境的配置文件,重新执行构建脚本即可
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

