一、docker容器部署如何通过git拉取实时快速迭代部署
需求是希望docker项目每次更新不要一遍遍build镜像
初步思路:
1、 docker开启容器的时候,volume出来app目录文件
2、 项目更新完用指令scp把dist打包文件传到volume卷中,或者git pull
3、 docker commit 重新打一个镜像出来,然后重启镜像
实际难度:
1、 当我第一次通过dockerfile建立的镜像,想通过run指令映射一个文件夹到容器文件夹(我映射新建的
xt_cool
文件夹到WORKDIR /app
),但发现报错,意思无法打开package.json。错误如下:
2、 无法理解dockerfile镜像构建的真正原理,
CMD ["npm", "run", "docker"]
这个指令是否在每次镜像docker run
时就执行呢?还是在构建镜像的时候已经执行好了?我的猜想是前者。
解决问题的过程:
1、上面问题1中出现的情况,我本来的理解是在首次执行
docker run -itd --net=host --name xt_cool -v ~/xt_cool:/app a105950987/xt_cool:v0.2
时,正常来讲如果宿主机上的xt_cool文件如果是空的话,第一次会把镜像中/app的文件映射过来,讲道理并不应该报上面/app/package.json无法找到的错误,但仔细看这个错误,好像是容器里npm执行package.json的路径变成了/app/package.json,但是WORKDIR /app
当前工作路径就是/app,所以npm执行错误才报错的!
可能跟这条指令有点关系!- 容器内的文件夹和宿主机上的映射文件夹,在建立volume连接后是互相会实现同步的。
- 然后我先在xt_cool文件夹下用git拉取了代码,并为了解决权限导致的错误干扰我直接把所有文件的权限递归设置成777,
chmod -R 777 ./
当前文件下的所有子文件递归,切勿在根目录下之类使用此命令。- 成功后,我的理解就是,这次宿主机的文件第一次是主动的,直接会覆盖容器中的/app文件下的所有文件。
- 执行
docker run -itd --net=host --name xt_cool -v ~/xt_cool/admin-backend:/app a105950987/xt_cool:v0.2
- 进入容器发现是的,覆盖了!但是容器启动失败!因为宿主机中的admin-backend并没有安装npm依赖,所以被覆盖的容器中/app文件夹下依赖也是没有的。我需要去外层安装npm依赖。先全局安装
sudo apt install nodejs
,在全局安装sudo apt install npm
。2、上面2的疑问,在上面1问题解决的过程中,执行完安装依赖还是无法正常开启服务,我思考的是ts到js打包的步骤没有完成,然后查看了
CMD ["npm", "run", "docker"]
这个脚本指令,并没有执行npm run build
,所以我判断CMD ["npm", "run", "docker"]
这个指令是在每次镜像docker run
时就执行。因此我们要手动npm run build
打包,再重启容器。
总结:
1、docker build ...
跟之前一样正常构建镜像,因为构建出来的WORKDIR /app
里面的内容我们会直接覆盖,但打出来的镜像是会为我们构建好node环境的。
1、docker pull ...
拉取镜像。
1、mkdir -p ~/文件夹
创建宿主机映射文件夹。
2、git clone ...
克隆代码,切换到你要的分支
3、chmod -R 777 ./
解决权限导致的错误干扰我直接把所有文件的权限递归设置成777
4、npm install --registry=https://registry.npm.taobao.org
完成依赖安装。
5、npm run build
完成ts到js的构建。
6、docker run -itd --net=host --name xt_cool -v ~/宿主机映射文件夹/克隆项目文件:/app -v ~/xt_cool/logs:/root/logs a105950987/xt_cool:v0.2
开启容器(日志也要映射一下方便查看)
”/“是根目录,”~“是家目录。
Linux存储是以挂载的方式,相当于是树状的,源头就是”/“,也就是根目录。
而每个用户都有家目录,也就是用户的个人目录,比如root用户的家目录就是/root,普通用户a的家目录就是/home/a
7、如后面代码更新,宿主机映射文件夹里删除dist文件,然后git pull拉代码,然后执行npm run build
打包,然后docker restart 容器id
重启容器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。