【问题标题】:Using Chef to configure Docker image?使用 Chef 配置 Docker 镜像?
【发布时间】:2015-09-04 04:59:45
【问题描述】:

我有兴趣看看是否可以使用Chef 来配置Docker 容器(示例Dockerfile here)。

在我的图片中说,我希望设置一个 env var,所以我的 Dockerfile 可能包含这样的条目:

ENV MY_DB_URL http://devdb01.example.com

但在我的 QA/测试环境中,我可能希望它看起来像:

ENV MY_DB_URL http://testdb01.example.com

在生产中,值可能是http://db01.example.com 等。关键是我的Dockerfile 中存储的值需要不同,具体取决于环境(可能还有其他条件)。对于 Chef 模板来说,这似乎是一项完美的工作。

问题是Dockerfile 需要与我的应用程序的源代码一起保存在 VCS 中。那么如何使用 Chef 来“注入”具有所有正确值的 Dockerfile

【问题讨论】:

  • 我假设您正在从 docker cookbook here 或 supermaket here 中寻找 docker-container 资源

标签: docker chef-infra configuration-management


【解决方案1】:

这实际上是 Docker 的天才之处——您可以在启动时覆盖容器中的大部分配置设置。例如,我们的应用程序依赖于变量 APP_ENV 来确定它在哪个环境中运行(例如数据库连接参数等)。在本地运行我们运行它

docker run -d -e APP_ENV=local ourCompany/ourApp

在暂存时它会运行

docker run -d -e APP_ENV=staging ourCompany/ourApp

您可以使用 Docker-compose 轻松进行设置。

#base.yml
web:
  image: ourCompany/ourApp:latest

#staging.yml
web:
  extends: 
    file: base.yml
    service: web
  environment:
    - APP_ENV=staging

然后您可以使用docker-compose -f base.yml up -d 启动基本应用程序,或使用docker-compose -f staging.yml up -d 启动暂存版本

相信我 - 比在构建系统中使用 Chef 并为不同环境构建不同版本的映像要简单得多。

【讨论】:

  • 方式不那么复杂(可能有争议),但在使用多个环境几周后更容易出错(任何模板系统都可能有助于从一堆值创建这些文件,而不是管理它们手动)
  • 我之前没有注意到这条评论... docker-compose 允许几种继承形式,这意味着您的 'staging.yml' 文件只需要指定与您的 ' 不同的东西release.yml' 文件。
【解决方案2】:

如果代码 VCS 与环境无关,那么您的发布脚本需要负责更新 MY_DB_URL ENV 命令。最简单的方法是在 VCS Dockerfile 中粘贴一个占位符,即ENV MY_DB_URL %MY_DB_URL%,然后在部署期间将其替换为正确的值。

【讨论】:

  • 感谢@boyaa (+1) - 那么(一般来说)是否有让 Chef 配置您的 Docker 映像的用例?我看到有Chef management of containers,但我认为这与我在这里所说的不同。我相信该链接适用于您希望 Chef 确保将 Docker 引擎安装在 VM 上(但如果我错了请纠正我)。想法?
【解决方案3】:

chef-docker 食谱可能对您有用。它提供资源,因此您可以通过 Chef 创建容器。这是 repo 的 README 中的一个示例。

docker_container 'env' do
  repo 'debian'
  env ["PATH=#{node[:my][:path][:attribute]}", "FOO=#{node[:my][:foo][:attribute]}"]
  command 'env'
  action :run_if_missing
end

上面的代码根据你设置的节点属性在你的容器中设置环境变量,可以在每个环境中覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2018-01-11
    • 2022-10-14
    • 1970-01-01
    • 2015-10-07
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多