构建前提
由于从Oracle下载JDK时需要进行认证,而原有添加Request Head的方式已经不能用了,所以需要先下载jdk jar包到宿主机上
构建方式
整个构建流程通过bash脚本实现,该脚本中会复制JAR到构建上下文中、生成Dockerfile、写入文件内容,然后执行build完成构建。为了简单起见,在执行脚本时只需提供JDK jar路径、镜像名。脚本如下(当然你也可以在该脚本上进行优化和扩展,比如参数优化,解压流程优化等等,值得注意的是在写环境变量时,$符号要转义,否则会被当成变量把宿主机的环境变量写入)。
[root@localhost /]# cat javadockerbuild.sh
SRC=$1
# 截取jar包名称
JAVA_JAR_NAME=${SRC##*/}
echo "step01:----创建docker构建上下文目录"
BUILD_CONTEXT="/root/docker/javaDockerBuilderContext/$RANDOM"
while :
do
if [ -d $BUILD_CONTEXT ];then
echo "构建路径:["${BUILD_CONTEXT}"]已存在!重新生成"
else
mkdir -p $BUILD_CONTEXT
echo "构建路径:["${BUILD_CONTEXT}"]创建成功"
break
fi
done
echo "step02:----切换至构建路径"
cd $BUILD_CONTEXT
echo "step03:----copy JAR文件至构建路径"
cp $SRC $BUILD_CONTEXT
echo "step04:----解压JAR文件,提取其中文件夹名称"
tar -zxf $JAVA_JAR_NAME -C $BUILD_CONTEXT
TAR_DIR_NAME=""
for dir in $(ls $BUILD_CONTEXT)
do
if [ -d $dir ];
then
TAR_DIR_NAME=$dir
break
else
echo ${dir} not a dir,continue!
fi
done
echo "解压后的文件目录:"$TAR_DIR_NAME
echo "step05:----生成Dockerfile并写入文件内容"
filepath=$BUILD_CONTEXT/Dockerfile
touch $filepath
echo "FROM centos" >> $filepath
echo "MAINTAINER st.z 3020233092@qq.com " >> $filepath
echo "RUN mkdir -p /root/soft/java" >> $filepath
echo "COPY $JAVA_JAR_NAME /root/soft/java" >> $filepath
echo "WORKDIR /root/soft/java" >> $filepath
echo "RUN tar -zxf /root/soft/java/$JAVA_JAR_NAME" >> $filepath
echo "ENV JAVA_HOME=/root/soft/java/$TAR_DIR_NAME" >> $filepath
echo RUN echo \$JAVA_HOME >> $filepath
echo ENV PATH=\$PATH:\$JAVA_HOME/bin >> $filepath
echo "step06:----开始构建镜像"
docker build -t="$2" .
运行结果中下
[root@localhost /]# ./javadockerbuild.sh /root/java/jdk-8u231-linux-x64.tar.gz dnmy/jdk8:latest
step01:----创建docker构建上下文目录
构建路径:[/root/docker/javaDockerBuilderContext/2943]创建成功
step02:----切换至构建路径
step03:----copy JAR文件至构建路径
step04:----解压JAR文件,提取其中文件夹名称
解压后的文件目录:jdk1.8.0_231
step05:----生成Dockerfile并写入文件内容
step06:----开始构建镜像
Sending build context to Docker daemon 598.2MB
Step 1/9 : FROM centos
---> 0f3e07c0138f
Step 2/9 : MAINTAINER st.z 2928869682@qq.com
---> Using cache
---> 9c8f64669101
Step 3/9 : RUN mkdir -p /root/soft/java
---> Using cache
---> a702c8da33c9
Step 4/9 : COPY jdk-8u231-linux-x64.tar.gz /root/soft/java
---> Using cache
---> 4665e205b0f8
Step 5/9 : WORKDIR /root/soft/java
---> Using cache
---> ee51512d27c3
Step 6/9 : RUN tar -zxf /root/soft/java/jdk-8u231-linux-x64.tar.gz
---> Using cache
---> c66fc8e85093
Step 7/9 : ENV JAVA_HOME=/root/soft/java/jdk1.8.0_231
---> Using cache
---> b6bc1c4b508f
Step 8/9 : RUN echo $JAVA_HOME
---> Using cache
---> d2a2ee9bdc25
Step 9/9 : ENV PATH=$PATH:$JAVA_HOME/bin
---> Using cache
---> 70130cd4a554
Successfully built 70130cd4a554
Successfully tagged dnmy/jdk8:latest
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dnmy/rocket tag01 195540006885 6 days ago 1.09GB
dnmy/maven tag01 4b925559059f 6 days ago 879MB
dnmy/jdk8 latest 70130cd4a554 6 days ago 816MB
dnmy/jdk8 tag01 70130cd4a554 6 days ago 816MB
centos latest 0f3e07c0138f 2 months ago 220MB
验证Java环境变量
[root@localhost /]# docker run -i -t dnmy/jdk8 /bin/bash
[root@7038f981b351 java]# which java
/root/soft/java/jdk1.8.0_231/bin/java
发布到DockerHub
这里有几点需要注意,一是要先登录你的docker hub帐户,二是push时最好指定Tag,否则会推送该镜像的所有Tag。此外如果你没有预先在Docker hub上创建该镜像对应的仓库,也没关系,Docker Hub发现推送的镜像没的对应仓库时会自动创建。
[root@localhost /]# docker login
...
[root@localhost /]# docker push dnmy/jdk8:latest
The push refers to repository [docker.io/dnmy/jdk8]
8a24505a23ab: Layer already exists
42f20e6d0a63: Layer already exists
03b9b0e845ad: Layer already exists
9e607bb861a7: Layer already exists
latest: digest: sha256:29894dd41d502b02502a15d76f0d1b290484f4735ce05a4c9c7fe49191b823c0 size: 1162
[root@localhost /]#
Maven镜像的bash脚本
执行该脚本需要提供Jdk基础镜像及指定生成的镜像名
cat mavendockerbuild.sh
echo "step01:----创建docker构建上下文目录"
BUILD_CONTEXT="/root/docker/mavenDockerBuilderContext/$RANDOM"
while :
do
if [ -d $BUILD_CONTEXT ];then
echo "构建路径:["${BUILD_CONTEXT}"]已存在!重新生成"
else
mkdir -p $BUILD_CONTEXT
echo "构建路径:["${BUILD_CONTEXT}"]创建成功"
break
fi
done
echo "step02:----构建Dockerfile文件"
filepath=$BUILD_CONTEXT/Dockerfile
touch $filepath
echo "FROM $1" >> $filepath
echo "MAINTAINER st.z 3020233092@qq.com " >> $filepath
echo "RUN mkdir -p /root/soft/maven" >> $filepath
echo "WORKDIR /root/soft/maven" >> $filepath
echo "RUN yum install -y wget" >> $filepath
echo "RUN wget -q -O /root/soft/maven/apache-maven-3.6.3-bin.tar.gz http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz" >> $filepath
echo "RUN tar -zxf /root/soft/maven/apache-maven-3.6.3-bin.tar.gz" >> $filepath
echo ENV MAVEN_HOME /root/soft/maven/apache-maven-3.6.3 >> $filepath
echo ENV PATH=\$PATH:\$MAVEN_HOME/bin >> $filepath
echo "step03:----开始构建镜像"
cd $BUILD_CONTEXT
docker build -t="$2" .
RocketMQ镜像的bash脚本
RocketMQ的安装需要先安装JDK、Maven,所以运行该脚本需要提供Maven基础镜像。
[root@localhost /]# cat rocketdockerbuild.sh
#!/bin/sh
echo "step01:----创建docker构建上下文目录"
BUILD_CONTEXT="/root/docker/rocketDockerBuilderContext/$RANDOM"
while :
do
if [ -d $BUILD_CONTEXT ];then
echo "构建路径:["${BUILD_CONTEXT}"]已存在!重新生成"
else
mkdir -p $BUILD_CONTEXT
echo "构建路径:["${BUILD_CONTEXT}"]创建成功"
break
fi
done
filepath=$BUILD_CONTEXT/Dockerfile
echo "step02:----构建Dockerfile文件"
touch $filepath
echo "FROM $1" >> $filepath
echo "MAINTAINER st.z 3020233092@qq.com" >> $filepath
echo "RUN mkdir -p /root/rocketmq" >> $filepath
echo "WORKDIR /root/rocketmq" >> $filepath
echo "RUN yum install -y wget" >> $filepath
echo "RUN yum install -y unzip" >> $filepath
echo "RUN wget -q -O /root/rocketmq/rocketmq-all-4.4.0-source-release.zip https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip" >> $filepath
echo "RUN unzip rocketmq-all-4.4.0-source-release.zip" >> $filepath
echo "WORKDIR /root/rocketmq/rocketmq-all-4.4.0/" >> $filepath
echo "RUN mvn -Prelease-all -DskipTests clean install -U" >> $filepath
echo "ENV ROCKET_HOME=/root/rocketmq/rocketmq-all-4.4.0/distribution/target/apache-rocketmq" >> $filepath
echo ENV PATH=\$PATH:\$ROCKET_HOME/bin >> $filepath
echo "step03:----开始构建镜像"
cd $BUILD_CONTEXT
docker build -t="$2" .