使用Chef配置Docker镜像?

时间:2015-09-02 11:29:20

标签: docker chef configuration-management

我很想知道是否可以使用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“注入”所有正确的值?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

如果代码VCS与环境无关,那么您的发布脚本需要负责更新MY_DB_URL ENV命令。最简单的方法是将占位符粘贴到VCS Dockerfile中,即<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://localhost:5432/automate" /> <property name="username" value="postgres" /> <property name="password" value="" /> </bean> <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="packagesToScan" value="ru.jeak.keep" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="connection.pool_size">3</prop> <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop> <prop key="hibernate.default_schema">test</prop> </props> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="userHibernateDAO" class="ru.jeak.keep.repository.hibernate.UserHibernateDAO" /> <bean id="projectHibernateDAO" class="ru.jeak.keep.repository.hibernate.ProjectHibernateDAO" /> <bean id="taskHibernateDAO" class="ru.jeak.keep.repository.hibernate.TaskHibernateDAO" /> ,然后在部署期间将其替换为正确的值。

答案 2 :(得分:0)

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

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

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