开发测试期间,需要多次打包上传测试服务器,打出来的jar包100M左右,要是构建成docker镜像至少200M往上。
为了加快上传部署测试包的速度,想到了直接运行jar不用docker(但是为了保证与线上环境一致,必须用docker)。然后决定 jar文件解包 分离lib依赖(lib文件不变动的话只需要传一次)。测试服务器上构建docker镜像。
方式一
pom文件,配置build解包插件
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!--spring-boot Maven 插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
<!--Maven创建Docker镜像 之前解包JAR-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</build>
然后,把解包后的文件和Dockerfile上传服务器
#FROM openjdk:8-jdk-alpine
FROM openjdk:8-jre
VOLUME /tmp
ARG DEPENDENCY=dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 9081
ENTRYPOINT ["java","-cp","app:app/lib/*","com.xxx.Application"]
# 本地执行 clean package
# maven打包时, 解压出来的文件(需要传到服务器上的那一部分)目录结构
#├─ Dockerfile ##上传服务器
#├─ target
#└── dependency ##上传服务器(包括所有子目录及文件)
# ├── BOOT-INF
# │ ├── classes
# │ │ └── 略
# │ └── lib
# │ └── 略
# ├── META-INF
# │ └── 略
# └── org
# └── 略
# linux服务器上使用docker部署项目
#1. 在linux服务器上创建文件夹, 例如: freeman
#2. 将maven打包后解压出来(target目录下)的 dependency 目录和Dockerfile文件 传到服务器的freeman文件夹(以后修改代码,只需要替换部分内容,然后重新构建镜像)
#3. docker build镜像
# 进入freeman文件夹
# docker build -t freeman:test .
# 注意语句结束后的“.”,不可省略
#4. 创建容器,并启动(如果存在,先删除), 预览效果
# docker run -it --rm -p 9081:9081 --name app -v /etc/localtime:/etc/localtime freeman:test
#5. 创建容器,在后台启动(预览能正常启动后)
# docker run -d -p 9081:9081 --name app -v /etc/localtime:/etc/localtime freeman:test
#
#到此部署成功。
方式二
pom文件,build配置依赖外部lib
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--<classifier>exec</classifier>-->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.fyts.api.ApiApplication</mainClass> <!--指定Springboot程序启动类-->
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix> <!--指定依赖的jar包相对于本程序jar的位置-->
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
然后,手动把打好的jar中BOOT-INF
目录下的lib文件解压出来,与jar包、还有Dockerfile
上传到服务器的同一目录下
FROM frolvlad/alpine-oraclejre8
VOLUME /tmp
COPY xxxyyyzzz.jar app.jar
COPY lib lib
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=test -jar app.jar" ]
之后,在服务器上构建docker镜像…
查看实时日志
docker logs [选项][选项]... 容器名称
选项
- -f : 查看实时日志
- -t : 查看日志产生的日期
- –since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
- -tail=10 : 查看最后的10条日志。
用法示例
docker logs -f -t --since="2020-02-02" --tail=200 容器名称
docker logs -f --tail=100 demo-api
别人项目的Dockerfile:
FROM anapsix/alpine-java:8_server-jre_unlimited
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /opt/projects/mall4j
WORKDIR /opt/projects/mall4j
EXPOSE 8086
ADD ./yami-shop-api/target/yami-shop-api-0.0.1-SNAPSHOT.jar ./
CMD java -jar -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -Dspring.profiles.active=docker yami-shop-api-0.0.1-SNAPSHOT.jar