工作笔记汇总二

一、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。错误如下:

  • image.png
  • 工作笔记汇总二_第1张图片

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执行错误才报错的!

  • image.png
    可能跟这条指令有点关系!
  • 容器内的文件夹和宿主机上的映射文件夹,在建立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里面的内容我们会直接覆盖,随意。
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 a105950987/xt_cool:v0.2开启容器
7、如后面代码更新,宿主机映射文件夹里删除dist文件,然后git pull拉代码,然后执行 npm run build打包,然后 docker restart 容器id重启容器

你可能感兴趣的:(node.js)