使用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,这可以在每个环境中重写。