通过容器模板使容器与配置文件一起使用

时间:2019-01-16 07:51:45

标签: docker ansible

我使用ansible推出自定义服务以及这些应用程序的模板配置文件(每个应用程序/服务器/环境不同)

我正在迁移到Docker来运行我的服务,但仍然需要利用ansible推送的配置文件。

因此,到目前为止,我允许ansible将配置模板推送到远程主机,然后将配置目录作为卷安装在容器中,以使在容器中运行的服务访问该配置数据。

这个骇人的解决方案要求三个分离的东西对齐才能正常工作(可以将配置文件推到正确的路径,将该路径正确地作为卷安装到容器的容器,以及应用程序在安装位置查找配置) -这会带来高风险,难以管理和难以更改的尖叫。

有哪些更好的方式可以将可用的模板化配置文件提供给容器?还是我需要开始寻找ansible的替代品?

一些想法:

  • 我在dev / qa / prod中有很多不同的VM和应用程序集 环境,所以我不想将烘焙配置引入 图片,否则我将获得数百张图片
  • 我可以在容器运行时加载配置,但是我如何才能以一种方式利用ansibles进行模板化,而无需从容器内部运行ansible剧本(以某种方式?)< / li>

1 个答案:

答案 0 :(得分:1)

实际上,您现在所遵循的路径似乎是一条不错的路,我可能什么也不会改变。

由于Docker容器具有隔离的文件系统,因此容器通常使用固定的“正常”文件系统路径。例如,standard nginx image在容器空间中充斥着对/etc/nginx的引用。将这些容器侧路径视为图像外部接口的一部分是合理的;您应该将路径/etc/nginx/nginx.conf视为与命令行选项-g 'daemon off'一样稳定(您不希望此路径在映像更新中发生变化)。

为避免重复文件路径,可以使用Ansible variable。如果您要启动的每个容器都有一个角色,这可能会更有用。您可以提供默认的主机端路径,并在顶级手册或命令行中覆盖它。这样一来,您就可以写出像这样的容器启动剧本

- name: Copy nginx.conf
  template:
    src: nginx.conf.j2
    dest: "{{ nginx_config_path }}/nginx.conf"

- name: Launch nginx
  docker_container:
    name: nginx
    image: nginx
    volumes:
      - "{{ nginx_config_path }}:/etc/nginx"

请注意,这个问题并不是Ansible特有的。 ConfigMap对象与此最接近,并且就像您在此描述的一样,它也是将配置文件注入到容器(Pods)中的正确路径,但是本质上存在相同的问题,即需要三对要匹配的名称。再一次,没有什么比尝试在业务流程系统允许的范围内尝试使用“变量”或“常量”更好的解决方案了,希望该问题能早日得到解决。