Путь, по которому вы идете сейчас, на самом деле кажется хорошим, и я, вероятно, ничего бы не изменил.
Поскольку контейнер Docker имеет изолированную файловую систему, контейнеры обычно используют фиксированные «нормальные» пути файловой системы. Например, стандартное изображение nginx изобилует ссылками на /etc/nginx
в пространстве контейнера. Целесообразно рассматривать эти пути на стороне контейнера как часть внешнего интерфейса с изображением; Вы должны трактовать путь /etc/nginx/nginx.conf
как стабильный, как параметр командной строки -g 'daemon off'
(вы не ожидаете, что этот путь будет меняться при обновлении образа).
Чтобы избежать повторения пути к файлу, вы можете использовать переменную Ansible . Это может быть более полезным, если у вас есть роль для запускаемого контейнера. Вы можете указать путь по умолчанию на стороне хоста и переопределить его в Playbook верхнего уровня или в командной строке. Это позволило бы вам написать игровую книгу, запускающую контейнер, как
- 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. A kubernetes Объект ConfigMap является наиболее близким к этому эквиваленту, и, как и то, что вы здесь описываете, это также правильный путь для вставки файлов конфигурации в контейнеры (Pod), но он по сути имеет ту же проблему, требуя три пары имен, чтобы соответствовать. Опять же, нет лучшего решения, чем пытаться использовать «переменную» или «константу» в той степени, в которой это позволяет ваша система оркестровки, и надеяться, что проблема будет обнаружена раньше, чем позже.