通常情况下制作镜像时,都是将jar包直接Add或Copy进入镜像中,这样启动容器后,如需更新jar包,需要重新制作镜像,从新制作容器,对于springboot的发布不易,那如果在不更新竞相或者容器的前提下就可以更新jar包呢。方法如下:

方法一:

1、制作Dcokerfile

FROM java:8
EXPOSE 8090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/data/data-center-service-1.0.0-SNAPSHOT.jar"]

注意“/data/data-center-service-1.0.0-SNAPSHOT.jar”,在这里我们指定了运行容器里/data目录下的data-center-service-1.0.0-SNAPSHOT.jar文件。

到这里我们会想到,每次发布新版本的jar包时,将该文件替换掉不就将应用更新了。如果直接进容器去修改,目前我还没有找到办法。我想到的是在宿主机中将其更新呢,这样是最方便。那解决方案就是将宿主机的目录与data目录进行关联。

2、制作镜像。

docker build -t eurekaclient:1.2.0 .

3、将容器目录与宿主机目录进行关联。

由于通过Dockerfile文件中的VOLUME进行关联,只能指定容器的目录,而宿主机的目录是随机的。这样是不能满足我的需求的。我只能采用docker run时指定关联目录,命令如下:

docker run --name eurekaclient_1 -it -v /home/xijie/app/eureka-client/workplace:/data -d -p 8090:8090 eurekaclient:1.2.0

--name为指定容器的名称;

-v 宿主机目录关联容器目录

-p指定容器暴露的端口

4、这样每次更新的jar包时,将新jar包放入宿主机的“/home/xijie/app/eureka-client/workplace”目录下即可。

5、然后docker stop启动的容器,然后再docker start容器就可以了。就将信的应用进行了发布。

小结:方法一虽然解决了更新jar包的问题,但是又出现了一个问题就是在Dockerfile中将使用的jar包名称写死了,这样每次更新jar包必须是同样的jar包,这样当应用从1.1版本更新1.2版本时就很痛苦,需要将本是1.2版本的jar包改名为1.1,这样会导致后续jar包的错乱。那方法二就来解决这个问题,使用脚本。

方法二:

1、制作脚本

(1)、创建.sh文件,本人创建了eurekaclient.sh文件,文件内容如下:

java -jar /data/data-center-service-2.0.0-SNAPSHOT.jar

启动容器data目录下的该jar包即可。

(2)、将该文件存储于与宿主机关联的目录下,即与容器data目录关联的目录下。

2、制作Dockerfile,内容如下:

FROM java:8
EXPOSE 8090
CMD ["sh","-c","/data/eurekaclient.sh"]

最后一条命令
CMD ["sh","-c","/data/eurekaclient.sh"]

就是在容器启动时启动上一步创建的.sh脚本。

3、将.sh文件,与.sh启动所需要的jar包放入容器与宿主机关联的目录。这样在宿主机中更新这俩文件,容器也对应的更新了。

4、创建镜像,命令如下:

docker build -t eurekaclient:1.0.0 .

5、创建并启动容器

 docker run --name eurekaclient_1 -it -v /home/xijie/app/eureka-client/workplace:/data -d -p 8090:8090 eurekaclient:1.0.0

启动容器,将宿主机的/home/xijie/app/eureka-client/workplace目录与容器的/data目录进行关联,这样更新宿主机的该目录文件,容器里的对应就更新了。这样就可以在不创建新镜像与容器的情况下,进行了应用的更新发布。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐