Docker镜像构建(JDK、Maven、RocketMQ)

构建前提
  由于从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" .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值