#基础镜像
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。