基于Docker部署应用最佳实践
1. 最近修复测试bug的同时,发现之前docker部署中镜像构建和docker run命令有挺多不合理的设置
(1)首先是镜像构建,直接用了jdk镜像,再通过docker run运行command命令
这种方式运行好处在于不用构建各个应用镜像,但带来的坏处就是需要在command处做文章满足应用运行时各种配置,而且这种方式同开发时运行程序多多少少有出入,带来排查问题的困扰。
(2)运行时当前路径问题
以上基于jdk镜像直接运行command,需要考虑到容器当前WORKDIR为根目录/,而应用相关的都部署在/app路径下,如果增加了一些资源文件而且程序中引用方式为相对路径,就很容易出现问题。
比如如下,我增加了sidebar.yml文件,程序中使用相对路径获取该文件config/sidebar.yml,开发环境中木有问题,部署测试后出现FileNotFound异常。
究其原因,以上容器运行方式,command是在根路径/下执行,程序会加载/config/sidebar.yml而非真正的/app/config/sidebar.yml。
将command修改为 sh -c "cd /app && java -jar app.jar --spring.profiles.active=archive"解决问题。
经过以上实践,为减少约定减少配置,应当为每个应用构建镜像,将类似以上工作路径,command固化在镜像内(如下),保持同开发环境一致。在docker run时将可能的变化项映射出来。
清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己
-- 共勉