使用 Chef 配置 Docker 图像?

Using Chef to configure Docker image?

我有兴趣看看我是否可以使用 Chef to configure a Docker container (sample Dockerfile here)。

在我的图片中说,我希望设置一个环境变量,所以我的 Dockerfile 可能包含如下条目:

ENV MY_DB_URL http://devdb01.example.com

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

ENV MY_DB_URL http://testdb01.example.com

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

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

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

这实际上是 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 并为不同环境构建不同版本的图像要简单得多。

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

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