使用 Chef 配置 Docker 图像?
Using Chef to configure Docker image?
我有兴趣看看我是否可以使用 Chef to configure a Docker container (sample Dockerfile
here)。
在我的图片中说,我希望设置一个环境变量,所以我的 Dockerfile
可能包含如下条目:
ENV MY_DB_URL http://devdb01.example.com
但在我的 QA/test 环境中,我可能希望它看起来像:
ENV MY_DB_URL http://testdb01.example.com
在生产中,值可能是 http://db01.example.com
,等等。关键是存储在我的 Dockerfile
中的值需要不同,这取决于环境(可能还有其他条件)。这似乎是 Chef 模板的完美工作。
问题是 Dockerfile
需要与我的应用程序源代码一起保存在 VCS 中。那么 Chef 如何才能使用 "inject" 具有所有正确值的 Dockerfile
?
如果代码 VCS 与环境无关,那么您的发布脚本需要负责更新 MY_DB_URL ENV 命令。最简单的方法是在 VCS Dockerfile 中插入一个占位符,即 ENV MY_DB_URL %MY_DB_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 食谱可能对您有用。它提供资源,因此您可以通过 Chef 创建容器。这是 repo 的 README 中的示例。
docker_container 'env' do
repo 'debian'
env ["PATH=#{node[:my][:path][:attribute]}", "FOO=#{node[:my][:foo][:attribute]}"]
command 'env'
action :run_if_missing
end
上面的代码根据您设置的节点属性在您的容器中设置环境变量,可以在每个环境中覆盖。
我有兴趣看看我是否可以使用 Chef to configure a Docker container (sample Dockerfile
here)。
在我的图片中说,我希望设置一个环境变量,所以我的 Dockerfile
可能包含如下条目:
ENV MY_DB_URL http://devdb01.example.com
但在我的 QA/test 环境中,我可能希望它看起来像:
ENV MY_DB_URL http://testdb01.example.com
在生产中,值可能是 http://db01.example.com
,等等。关键是存储在我的 Dockerfile
中的值需要不同,这取决于环境(可能还有其他条件)。这似乎是 Chef 模板的完美工作。
问题是 Dockerfile
需要与我的应用程序源代码一起保存在 VCS 中。那么 Chef 如何才能使用 "inject" 具有所有正确值的 Dockerfile
?
如果代码 VCS 与环境无关,那么您的发布脚本需要负责更新 MY_DB_URL ENV 命令。最简单的方法是在 VCS Dockerfile 中插入一个占位符,即 ENV MY_DB_URL %MY_DB_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 食谱可能对您有用。它提供资源,因此您可以通过 Chef 创建容器。这是 repo 的 README 中的示例。
docker_container 'env' do
repo 'debian'
env ["PATH=#{node[:my][:path][:attribute]}", "FOO=#{node[:my][:foo][:attribute]}"]
command 'env'
action :run_if_missing
end
上面的代码根据您设置的节点属性在您的容器中设置环境变量,可以在每个环境中覆盖。