Spring Boot使用DockerFile maven插件自动化部署
参URL; https://blog.csdn.net/liubingyu12345/article/details/79015966
Spring Boot with Docker
官方参考URL: https://spring.io/guides/gs/spring-boot-docker/
DOCKER_HOST=tcp://:2375
Dockerfile Maven的特性
mvn dockerfile:build
mvn dockerfile:tag
mvn dockerfile:push
构建Docker项目时,直接执行mvn deploy即可构建并发布Dockerfile文件到Maven本地库。
org.springframework.boot
spring-boot-maven-plugin
com.spotify
dockerfile-maven-plugin
${dockerfile-maven-version}
${docker.image.prefix}/${project.artifactId}
${project.version}
target/${project.build.finalName}.jar
至此你可以构建一个有tagged的docker的镜像,使用命令
$ ./mvnw dockerfile:build
你也可以push这个镜像到仓库
./mvnw dockerfile:push
mvnw全名是Maven Wrapper,是对mvn的封装,没有引入mvnw时候,你可以直接使用mvn。
至此,你已经可以使用mvn命令手动直接打包镜像了,也可以使用IDEA的界面maven界面操作。
如何把构建镜像、和推送镜像放到你maven的生命周期中呢?pom插件plugin配置项加入如下配置项:
you can make dockerfile:push automatically run in the install or deploy lifecycle phases by adding it to the plugin configuration.
你可以根据需要,添加不同配置项:
default
install
build
push
打包时,构建镜像:
package
build
```
phase元素代表的是绑定的生命周期的阶段 。
goals 元素代表插件的目标 插件是你前面artifactId中定义好的 goals相当于该插件中的一个功能 该功能将在phase绑定的生命周期阶段执行。
goal是一个插件的具体功能 而不是一个阶段 phase才是。
org.springframework.boot
spring-boot-maven-plugin
com.spotify
dockerfile-maven-plugin
${dockerfile-maven-version}
${docker.image.prefix}/${project.artifactId}
${project.version}
target/${project.build.finalName}.jar
FROM
指定 base 镜像。
MAINTAINER
设置镜像的作者,可以是任意字符串。
COPY
将文件从 build context 复制到镜像。
COPY 支持两种形式:
COPY src dest
COPY [“src”, “dest”]
注意:src 只能指定 build context 中的文件或目录
ADD
与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
ENV
设置环境变量,环境变量可被后面的指令使用。例如:
…
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
…
6. EXPOSE
指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。
Dockerfile中不管有没有EXPOSE端口,需要新增端口映射只能restart container。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
经测试,好像声明了EXPOSE -P 也不会帮你自动映射。
VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录VOLUME ,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录VOLUME ,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
8. WORKDIR
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
9. RUN
在容器中运行指定的命令。
10. ENTRYPOINT
设置容器启动时运行的命令。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。
为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT