基于Dockerfile自定义构建应用程序镜像

一、前言

现在容器化已成为大趋势,把程序依赖的编译环境通过容器来部署能够解决在不同系统上部署应用的问题,同时也可以把编译打包好的程序文件放置在容器中,常见的应用程序有java、python、go、php、node等,运维肯定会涉足很多各种不同的环境部署,这里就通过以centos7为基础镜像来自定义构建应用镜像,同时以实际的代码例子来进行打包构建

二、开始

2.1.go环境

编写go环境Dockerfile
cat Dockerfile

FROM centos:7
MAINTAINER linuxwt <tengwanginit@gmail.com>

######更换163源######
RUN yum -y install wget \
gcc \
&& wget http://mirrors.163.com/.help/CentOS7-Base-163.repo \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak \
&& mv -f CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo \
&& yum makecache

#####安装go环境####
RUN mkdir -p /go/src /go/bin
ADD go1.13.1.linux-amd64.tar.gz /usr/local/   # 这里需要Dockerfile所在目录有go二进制包 

####设置go环境变量#####
ENV GOROOT /usr/local/go   ## go编译器目录
ENV GOPATH /go     #### go项目目录
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH

docker build -t golang:1.13-centos7 .
这样就生成了需要的go编译环境

下面是一个编译打包的例子
首先看下源码文件
03go1
这里有一个Dockerfile
cat Dockerfile

FROM golang:1.13-centos7 as build-stage
ENV GOPROXY=https://goproxy.cn
WORKDIR /go/src/dockerloader
COPY . .
RUN go mod tidy && go build -o dockerloader .
#####
FROM centos:7

ENV TZ=Asia/Shanghai

COPY --from=build-stage /go/src/dockerloader .
CMD ["./dockerloader"]

上面是一个多指令FROM的Dockerfile,目的是将当前的代码编译然后将编译得到的可执行文件放到另外一个镜像中形成需要的应用镜像,这里可以实现编译环境与执行环境分离
docker build -t dockerloader:1.2 .

2.2.java环境

编写java环境的Dockerfile
cat Dockerfile

FROM centos:7
MAINTAINER linuxwt <tengwanginit@gmail.com>

######更换163源######
RUN yum -y install wget \
gcc \
&& wget http://mirrors.163.com/.help/CentOS7-Base-163.repo \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak \
&& mv -f CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo \
&& yum makecache

######配置jdk#####
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u192-linux-x64.tar.gz /usr/local/java
RUN ln -s /usr/local/java/jdk1.8.0_192 /usr/local/java/jdk 
ENV JAVA_HOME /usr/local/java/jdk 
ENV JRE_HOME ${JAVA_HOME}/jre 
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib 
ENV PATH ${JAVA_HOME}/bin:$PATH 

###配置maven###### 
WORKDIR /usr
RUN mkdir /usr/local/maven
ADD apache-maven-3.5.4-bin.tar.gz /usr/local/maven
RUN ln -s /usr/local/maven/apache-maven-3.5.4 /usr/local/maven/maven
ENV MAVEN_HOME /usr/local/maven/maven
ENV PATH ${MAVEN_HOME}/bin:$PATH

注意上面的maven包和jdk的包,根据自己实际情况修改
docker build -t jdm-mvn:83-centos7 .

下面是打包源码并将编译好的包装载到镜像
cat Dockerfile

FROM jdk-mvn:83-centos7 as build-stage
WORKDIR /usr/local/project 
COPY . .
RUN mvn clean package
#####
FROM jdk-mvn:83-centos7 
ENV TZ=Asia/Shanghai
COPY --from=build-stage /usr/local/project .
ENTRYPOINT ["java" , "-jar" , "./*.jar"]

上面的打包的命令以及项目对应的目录project以及生成的jar包根据自己的实际情况修改