构建镜像不接触数据库

我想做和你一样的事情——我们在 Amazon ECS 上运行 Discourse,因此需要能够仅构建 Web 镜像并将其推送到注册表。我不愿意去修改 Discourse 的构建流程,因为我们希望尽可能贴近官方支持的安装方式。

相反,我们在本地机器上使用标准的 launcher 脚本来构建一个 双容器架构,但忽略数据容器,仅将 Web 容器推送到注册表。在运行时,我们通过环境变量覆盖 PostgreSQL 和 Redis 的连接信息。

部署新镜像分为三个步骤:

  1. 执行安全的预迁移。让 ECS 使用新镜像运行以下命令:

     SKIP_POST_DEPLOYMENT_MIGRATIONS=1 rake db:migrate
    
  2. 部署新镜像。更新 ECS 服务。

  3. 执行后迁移。让 ECS 运行以下命令:

     SKIP_POST_DEPLOYMENT_MIGRATIONS=0 rake db:migrate
    

在构建镜像时让本地数据容器运行可能有些浪费,但这意味着我们可以直接使用标准的 web.template.yml,而无需担心哪些部分会尝试连接数据库或 Redis。

8 个赞