#基础镜像
FROM openjdk:8
#创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
VOLUME /tmp
#复制test-1.0-SNAPSHOT.jar到/opt/app下且重命名为app.jar
COPY target/test-1.0-SNAPSHOT.jar /opt/app/app.jar
#复制配置文件到jar包外,为了以后在docker中修改配置文件,不然每次修改配置都要重出镜像
COPY target/classes/application.properties /opt/app/application.properties
COPY start.sh /opt/app/start.sh
#说明容器开放的端口
EXPOSE 80
#指定docker容器时区
# CentOS
RUN echo "Asia/shanghai" > /etc/timezone;
#容器启动后执行的命令,运行项目且指定spring配置文件环境
# ENTRYPOINT java -jar /opt/app/app.jar --spring.profiles.active=production
#容器启动后执行的命令,运行项目且指定spring配置文件地址
# ENTRYPOINT java -jar /opt/app/app.jar --spring.config.location=/opt/app/application.properties
# 脚本启动
ENTRYPOINT sh /opt/app/start.sh
start.sh内容如下:
java -Xms1024m -Xmx1024m -jar -Duser.timezone=GMT+08 -Dspring.config.location=/opt/app/application.properties /opt/app/app.jar
其中,-Xmx:指定jvm最大堆内存,-Xms:指定jvm启动时初始堆内存大小(此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存),-D:是用来在启动一个java程序时设置系统属性值的。如果该值是一个字符串且包含空格,那么需要包在一对双引号中。何为系统属性值呢?也就是在System类中通过getProperties()得到的一串系统属性。见下方测试代码:
public class SystemProperty {
public static void main(String[] args){
System.out.print(System.getProperty("user.timezone"));//输出GMT+08
}
}
补充:
1.时区(来源:如何解决Docker容器和宿主机时间同步问题)
# Ubuntu
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.Dockerfile首字母大写,放在项目根目录下即可。
3.图片来源:第一次用Dockerfile打包SpringBoot的Java Web应用
4.详解来源:docker——Dockerfile创建镜像
Dockerfile:
Dockerfile由一行行命令语句组成,并且支持用“#”开头作为注释,一般的,Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令。
Dockerfile指令:
1、FROM
格式:FROM <image>或 FROM <image>:<tag>
第一条指令必须为FROM指令,并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)
2、MAINTAINET
格式:MAINTAINET <name>
指定维护者的信息
3、RUN
格式:RUN <command> 或 RUN ["", "", ""]
每条指令将在当前镜像基础上执行,并提交为新的镜像。(可以用“\”换行)
4、CMD
格式:CMD ["","",""]
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条指令,则最后一条执行。(会被启动时指定的命令覆盖)
5、EXPOSE
格式:EXPOSE <port> [ <port> ...]
告诉Docker服务端暴露端口,在容器启动时需要通过 -p 做端口映射
6、ENV
格式:ENV <key> <value>
指定环境变量,会被RUN指令使用,并在容器运行时保存
7、ADD
格式:ADD <src> <dest>
复制指定的<src>到容器的<dest>中,<src>可以是Dockerfile所在的目录的一个相对路径;可以是URL,也可以是tar.gz(自动解压)
8、COPY
格式:COPY <src> <dest>
复制本地主机的 <src> ( 为 Dockerfile 所在目录的相对路径)到容器中的 <dest> (当使用本地目录为源目录时,推荐使用 COPY)
9、ENTRYPOINT
格式:ENTRYPOINT ["","",""]
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。(每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效)
10、VOLUME
格式:VOLUME ["/mnt"]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
11、USER
格式:USER daemon
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
12、WORKDIR
格式:WORKDIR /path/to/workdir
为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。(可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径, 则会基于之前命令指定的路径)
13、ONBUILD
格式:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
◆堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。
◆非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。