美文网首页
Shipit Node App with Docker

Shipit Node App with Docker

作者: lanvige | 来源:发表于2017-03-03 16:03 被阅读0次

上面提到如何在代码部署到 Remote Server 后,将 Sercert file link 到相应位置,然后通过 PM2 启动服务。

但我们真实的项目,是构建 Docker 镜像然后启动镜像来实现最终的发布,毕竟 Docker 有着更好的隔离性。

使用 Docker 的流程又是什么样子呢?

  1. 将代码放到 remote server 指定位置(已完成)。
  2. 在 remote server 上将 shared dirs/files 放到指定位置。
  3. 在代码目录下 build docker image。
  4. 启动。

Symbolic link Issue

但实践中,发现一件很麻烦的事:docker dislike symbolic link 😓 。Dokcer build 时会忽略 soft link 的文件,如果项目根目录是 soft link,也会出现问题,接下来主要就是解决这两个问题。

shiptit-shared-copy

首先的是,app 目录中不能含有 soft link 文件,不然不会被 copy 到 docker 镜像中。

像 config/application.yml 这种通过 link 方式存在的,就不行了。

所以,解决方案是直接 fork shipit-shared 项目,把 symbolic link 改成 copy。

每次都会把文件复制到 current 对应的 release 版本中。

配置文件和 shipit-shared 保持不变:

module.exports = function (shipit) {
  require('shipit-deploy')(shipit);
  require('shipit-shared')(shipit);

  shipit.initConfig({
    default: {
      shared: {
        overwrite: true,
        files: [
          'config/application.yml',
          'config/database.yml'
        ],
      }
    }
  });
};

deploy-duplicate

解决完 app 内部 soft link 的问题后,然后在 current 下用 docker-compose 构建镜像,然后启动。发现不能重复,原因是,每次构建的目录并不是 current 这个 soft link 的目录。而是 releases/[version] 这个目录。

目录名变化后,构建出的镜像就不一致了,这就导致无法重复的在一个目录下进行多次构建。

compose 构建后的镜像是用 目录名+service 名。就会有 20170302110102-app-koa2 这样的名字。而不是 current-app-koa2

除了会构建出多个不同名的镜像,容器也无法被销毁,导致端口被占用。就是说,这个构建不能被重复。

解决办法也有,就是把releases/[version] 物理复制到另一个 current 一样的固定的位置。起名叫 deploy。就是下面这样的目录结构了:

.
|-- current -> releases/20170228072117
|-- deploy
|   |-- app
|   |-- bin
|   |-- config
|   |-- docker-compose.yml
|   |-- Dockerfile
|   |-- lib
|   |-- package.json
|   |-- process.yml
|   |-- REVISION
|   `-- yarn.lock
|-- releases
|   |-- 20170228062744
|   `-- 20170228072117
`-- shared
    `-- config

这样,每次在 published 后,都将最新的 releases 版本复制到 deploy。然后在 deploy 下执行 docker-compose up -d --build

因为比较简单,没有做成单独的 npm,直接放在 shipitfile 中,复制即可使用:

module.exports = function (shipit) {
  // Docker dislike soft link
  // So make a physical copy (deploy) instead of softlink (current)
  shipit.blTask('deploy-clean', function () {
    console.log('cp -R ' + shipit.releasePath + ' ' + shipit.config.deployTo + '/deploy');
    return shipit.remote('rm -rf ' + shipit.config.deployTo + '/deploy');
  });

  shipit.blTask('deploy-duplicate', function () {
    return shipit.remote('cp -R ' + shipit.releasePath + ' ' + shipit.config.deployTo + '/deploy');
  });

  shipit.on('published', function () {
    shipit.start(['deploy-clean', 'deploy-duplicate']);
  });
}

Docker up

解决完 Symbolic link 的问题后,终于可以将 Docker 跑起来了。通过 docker-compose.yml 文件,可以将配置都放在其中,然后,只要在相应的目录下启动 docker 的命令就好了。

// Docker build & run on Remote
shipit.blTask('docker-up', function () {
  shipit.log('docker-compose up with build...');
  return shipit.remote('cd ' + shipit.config.deployTo + '/deploy; docker-compose up -d --build');
});

REF::

相关文章

网友评论

      本文标题:Shipit Node App with Docker

      本文链接:https://www.haomeiwen.com/subject/ztlrgttx.html