通过docker build --build-arg 传值进 Dockerfile 动态构建容器

目录

    • 前言
    • shell
    • Dockerfile
    • 执行命令

前言

编写发布脚本,期望实现传不同参数,构建对应不同版本容器。踩了不少坑,总算实现,直接上代码。

shell

将以下内容保存为 demo.sh

#!/usr/bin/env bash
# 定义应用组名
group_name='demo'
# 定义应用名称
app_name='javademo'
# 定义应用版本
app_version=$1
# 定义应用环境
profile_active=$2
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -f ./Dockerfile -t ${group_name}/${app_name}:${app_version} --build-arg JAR_VERSION=${app_version} .
echo '----build image----'
docker run -p 8088:8088 --name ${app_name} \
-e 'spring.profiles.active'=${profile_active} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

Dockerfile

将以下内容保存为 Dockerfile

# 该镜像需要依赖的基础镜像
FROM java:8
# 要想在 FROM 之后使用,必须再次指定
ARG JAR_VERSION
# ENTRYPOINT 只认 ENV 环境变量
ENV JAR_VERSION=${JAR_VERSION}
# 将当前目录下的jar包复制到docker容器的/目录下
ADD target/javademo-${JAR_VERSION}.jar /javademo-${JAR_VERSION}.jar
# 声明服务运行在8088端口
EXPOSE 8088
# 指定docker容器启动时运行jar包,环境变量插值只能使用下面这种写法。
ENTRYPOINT java -jar /javademo-${JAR_VERSION}.jar
# 这种写法不行。
# ENTRYPOINT ["java", "-jar","/javademo-${JAR_VERSION}.jar"]
# 指定维护者的名字
MAINTAINER demo

执行命令

sh ./demo.sh 1.0-SNAPSHOT test

你可能感兴趣的:(docker,docker,容器,自动化,bash,shell)