使用Chef配置Docker映像?

使用Chef配置Docker映像?,docker,chef-infra,configuration-management,Docker,Chef Infra,Configuration Management,我想看看是否可以使用配置Docker容器(示例) 在我的图像中,我希望设置一个env var,因此我的Dockerfile可能包含如下条目: ENV MY_DB_URL http://devdb01.example.com 但在我的QA/测试环境中,我可能希望它看起来像: ENV MY_DB_URL http://testdb01.example.com 在生产中,该值可能是http://db01.example.com等。重点是存储在myDockerfile中的值需要不同,这取决于环境(可

我想看看是否可以使用配置Docker容器(示例)

在我的图像中,我希望设置一个env var,因此我的
Dockerfile
可能包含如下条目:

ENV MY_DB_URL http://devdb01.example.com
但在我的QA/测试环境中,我可能希望它看起来像:

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


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

如果代码VCS与环境无关,那么您的发布脚本需要负责更新MY_DB_URL ENV命令。最简单的方法是在VCS Dockerfile中粘贴一个占位符,即
ENV MY\u DB\u URL%MY\u DB\u 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_container 'env' do
  repo 'debian'
  env ["PATH=#{node[:my][:path][:attribute]}", "FOO=#{node[:my][:foo][:attribute]}"]
  command 'env'
  action :run_if_missing
end

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

谢谢@boyaa(+1)-那么(一般来说)是否有让Chef配置Docker映像的用例?我知道有,但我不认为这和我在这里说的是同一件事。我相信该链接适用于希望Chef确保Docker引擎安装在VM上的情况(如果我错了,请纠正我)。想法?我假设您正在从docker cookbook或supermaket上寻找
docker容器
资源,这种方式不太复杂(可能会有争议),但使用多个环境几周后更容易出错(任何模板系统都可能有助于从一堆值创建这些文件,而不是手动管理它们)我以前没有注意到这个评论。。。docker compose允许两种形式的继承,这意味着“staging.yml”文件只需指定与“release.yml”文件不同的内容。