使用多容器分离应用程序和外部依赖

应用程序除了可执行程序和配置文件之外, 还有一类特殊的依赖,比如 商业软件的License文件, 苹果手机消息推送所需要的证书文件。 这类文件有如下的特性

  1. 不是项目源代码的一部分,不应该和源代码放在一起
  2. 更新周期固定,且比较长,一般是1-3年才需要更新一次。
  3. 文件体积较小。

为什么不能放在源代码中?

以商业软件的Licence文件为例, 当License 到期后, 需要运维到生产环境中使用新的License文件替换旧的文件, 这项变更是一项纯运维工作, 无需开发发布新版本。 如果将License文件放在源代码中,就需要开发发布新版本。

那么如何管理这些配置文件

推荐方法是

  • 使用一个新的镜像,专门存放License文件,
  • 然后将这个镜像以volume 的形式挂载到 原应用程序的容器中。
  • 当License更新时,更新这个镜像即可 .

详细步骤

0. 基本信息

以添加一个 License文件为例,

  1. license 文件名为 mosek.lic
  2. 应用程序名称为 invest-brain

原始docker-compose 文件

  invest-brain:
    image: registry-ci.datayes.com/mom-web/mof-uranus:3.18.3-1306

1. 准备镜像

准备如下文件,Dockerfile , mosek.lic

Dockerfile 的内容为

FROM registry.datayes.com/cache/alpine:latest
MAINTAINER Daniels Cai
ADD mosek.lic /root/mosek/mosek.lic

docker build 之后,我们得到一个 docker镜像, 名称为 registry.datayes.com/base/invest-brain-lic-base:1-249

2. 准备 docker-compose

docker-compose中添加 invest-brain-license , 并设置 volumes, 将 /root/mosek 目录暴露出来

  invest-brain-license:
    image: registry.datayes.com/base/invest-brain-lic-base:1-249
    stdin_open: true
    tty: true
    volumes:
    - /root/mosek/

从invest-brain 中挂在这个容器的 volume

  invest-brain:
    image: registry-ci.datayes.com/mom-web/mof-uranus:3.18.3-1306
    volumes_from:
    - invest-brain-license
    labels:
      io.rancher.sidekicks: invest-brain-license    

修改之后的 docker-compose 文件如下

  invest-brain-license:
    image: registry.datayes.com/base/invest-brain-lic-base:1-249
    stdin_open: true
    tty: true
    volumes:
    - /root/mosek/
  invest-brain:
    image: registry-ci.datayes.com/mom-web/mof-uranus:3.18.3-1306
    volumes_from:
    - invest-brain-license
    labels:
      io.rancher.sidekicks: invest-brain-license

注意, 需要添加 sidekicks 的 label , 来保证 两个容器一定会被调度在同一台主机上

3. 更新生产环境

当License 文件更新时, 我们按照以上步骤重新生成新镜像, 需要做一下两件事

  1. 手动在生产环境中更新该镜像到最新版.
  2. 更新docker-compose 文件, 保证下一次发布新版本时,使用的是最新license文件.

你可能感兴趣的:(使用多容器分离应用程序和外部依赖)