我很想知道是否可以使用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
“注入”所有正确的值?
答案 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
上面的代码根据您设置的节点属性在容器中设置环境变量,可以在每个环境中覆盖这些属性。