使用ChefconfigurationDocker镜像?

我有兴趣看看我是否可以使用Chef来configuration一个Docker容器( 这里是示例Dockerfile )。

在我的图像中说,我希望有一个env var集,所以我的Dockerfile可能包含一个条目,如下所示:

 ENV MY_DB_URL http://devdb01.example.com 

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

 ENV MY_DB_URL http://testdb01.example.com 

在生产中,值可能是http://db01.example.com等。重点是存储在我的Dockerfile中的值需要不同,取决于环境(以及可能的其他条件)。 这似乎是一个厨师模板完美的工作。

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

这实际上是Docker的天才 – 您可以在启动时覆盖容器中的大部分configuration设置。 例如,我们的应用程序依赖于一个variablesAPP_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 base.yml up -d ,或者使用docker-compose -f base.yml up -d启动基本应用程序docker-compose -f staging.yml up -d

相信我 – 比在你的构build系统中使用Chef更简单,并为不同的环境构build不同版本的图像。

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

厨师docker食谱可能对你有用。 它提供了资源,所以你可以通过厨师创build容器。 这是来自回购的自述文件的一个例子。

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

上面的代码根据您设置的节点属性在您的容器中设置环境variables,这可以在每个环境中重写。