描述
我希望使用不同的compose.yml文件而不是单个docker-compose.yml文件带来两个容器。在每个docker-compose.<service>.yml文件中,我有一个Jinja模板,它根据vars/main.yml中提到的服务来填充模板文件。
一个简单的例子:
docker-compose.chronograf.yml.j2
version: "3"
services:
chronograf:
image: chronograf:{{ services.chronograf.version }}
container_name: chronograf
{% if 'influxdb' in services %}
depends_on:
- influxdb
{% endif %}
environment:
- BASE_PATH=/chronograf
{% if 'influxdb' in services %}
- INFLUXDB_URL=http://influxdb:8086
{% endif %}
hostname: chronograf
labels:
- "traefik.enable=true"
- "traefik.http.routers.chronograf-router=chronograf-router@file"
- "traefik.http.routers.chronograf-router.service=chronograf@file"
security_opt:
- "no-new-privileges:true"
volumes:
- chronograf:/var/lib/chronograf
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
volumes:
chronograf:docker-compose.influxdb.yml.j2
version: "3"
services:
influxdb:
container_name: influxdb
image: influxdb:{{ services.influxdb.version }}
environment:
- INFLUXDB_HTTP_AUTH_ENABLED=true
- INFLUXDB_REPORTING_DISABLED=true
- INFLUXDB_DATA_QUERY_LOG_ENABLED=false
- INFLUXDB_HTTP_LOG_ENABLED=false
- INFLUXDB_CONTINUOUS_QUERIES_LOG_ENABLED=false
hostname: influxdb
security_opt:
- "no-new-privileges:true"
volumes:
- influxdb:/var/lib/influxdb
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
volumes:
influxdb:上面的services定义如下:
services:
chronograf:
version: 1.9-alpine
influxdb:
version: 1.8-alpineJinja将能够添加组成YAML的depends_on部分,如果services.influxdb存在(它确实存在)
使用ansible带来堆栈
在一本剧本中,我有以下几点:
---
- host: all
tasks:
- name: Copy Services Compose Files
template:
src: "services/docker-compose.{{ item }}.yml.j2"
dest: "/home/test/influxstack/docker-compose.{{ item }}.yml"
with_items:
- "{{ services.keys() }}"
- name: Docker Compose with multiple Compose Files (v2)
community.docker.docker_compose:
project_name: influxstack
project_src: /home/test/influxstack
files:
- "docker-compose.{{ item }}.yml"
state: present
with_items:
- "{{ services.keys() }}" 错误
在本地机器上开始运行/运行时(通过创建一个目录/home/test/influxstack,我一直得到以下错误:
TASK [pacedge : Docker Compose with multiple Compose Files (v2)]
ok: [localhost] => (item=influxdb)
failed: [localhost] (item=chronograf) => {"ansible_loop_var": "item", "changed": false, "item": "chronograf", "msg": "Configuration error - Service 'chronograf' depends on service 'influxdb' which is undefined."}Ansible无法按照files在文档中提到的顺序来保持序列
我也曾尝试补充:
{{ services.keys() | reverse(sort=True) }}试着提起InfluxDB,但是我总是遇到同样的错误
系统信息
可抗
ansible [core 2.12.5]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/shantanoo/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/shantanoo/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/shantanoo/.ansible/collections:/usr/share/ansible/collections
executable location = /home/shantanoo/.local/bin/ansible
python version = 3.8.10 (default, Jun 22 2022, 20:18:18) [GCC 9.4.0]
jinja version = 2.10.1
libyaml = True码头组成
Docker Compose version v2.6.1pip list | grep -i "docker"
docker 4.1.0
docker-compose 1.25.0
dockerpty 0.4.1发布于 2022-08-29 13:59:07
您有两个独立的docker-compose.yaml文件;如果单独启动它们,您就不能在一个文件中的服务和另一个文件中的服务之间具有依赖关系。
按照你写剧本的方式,你正在有效地这样做:
docker-compose -f docker-compose.chronograf.yaml up
docker-compose -f docker-compose.influxdb.yaml up这是因为您使用的是with_items循环:对于列表中的每一个,您只运行一次docker_compose任务。
这是行不通的,因为当docker-compose启动进水数据库堆栈时,它不知道时间图堆栈。只有在运行docker-compose up引用命令行中的两个文件时才能工作,如下所示:
docker-compose -f docker-compose.chronograf.yaml -f docker-compose.influxdb.yaml up与你的剧本相对应的变化是:
- name: Docker Compose with multiple Compose Files (v2)
community.docker.docker_compose:
project_name: influxstack
project_src: /home/test/influxstack
files: "{{ compose_files }}"
state: present
vars:
compose_files: >-
{{ services.keys() |
map('regex_replace', '^(.*)$', 'docker-compose.\1.yaml')
}}我们删除了这个循环,而是构建了一个文件名列表,并将其作为files参数传递。
测试使用..。
playbook.yaml
- hosts: localhost
gather_facts: false
vars:
services:
service1:
service2:
tasks:
- name: Docker Compose with multiple Compose Files (v2)
community.docker.docker_compose:
project_name: influxstack
project_src: .
files: "{{ compose_files }}"
state: present
vars:
compose_files: >-
{{ services.keys() |
map('regex_replace', '^(.*)$', 'docker-compose.\1.yaml')
}}docker-compose.service1.yaml
version: "3"
services:
service1:
image: docker.io/alpine:latest
command:
- sleep
- infdocker-compose.service2.yaml
version: "3"
services:
service2:
image: docker.io/alpine:latest
command:
- sleep
- inf跑步:
ansible-playbook playbook.yaml在以下方面的成果:
$ docker-compose -p influxstack -f docker-compose.service1.yaml -f docker-compose.service2.yaml ps
Name Command State Ports
--------------------------------------------------
influxstack_service1_1 sleep inf Up
influxstack_service2_1 sleep inf Uphttps://stackoverflow.com/questions/73529702
复制相似问题