首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写作为列表提供的文件,在执行时提供配置错误

编写作为列表提供的文件,在执行时提供配置错误
EN

Stack Overflow用户
提问于 2022-08-29 13:37:02
回答 1查看 128关注 0票数 0

描述

我希望使用不同的compose.yml文件而不是单个docker-compose.yml文件带来两个容器。在每个docker-compose.<service>.yml文件中,我有一个Jinja模板,它根据vars/main.yml中提到的服务来填充模板文件。

一个简单的例子:

docker-compose.chronograf.yml.j2

代码语言:javascript
复制
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

代码语言:javascript
复制
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定义如下:

代码语言:javascript
复制
services:
  chronograf:
    version: 1.9-alpine
  influxdb:
    version: 1.8-alpine

Jinja将能够添加组成YAML的depends_on部分,如果services.influxdb存在(它确实存在)

使用ansible带来堆栈

在一本剧本中,我有以下几点:

代码语言:javascript
复制
---
- 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,我一直得到以下错误:

代码语言:javascript
复制
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文档中提到的顺序来保持序列

我也曾尝试补充:

代码语言:javascript
复制
 {{ services.keys() | reverse(sort=True) }}

试着提起InfluxDB,但是我总是遇到同样的错误

系统信息

可抗

代码语言:javascript
复制
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

码头组成

代码语言:javascript
复制
Docker Compose version v2.6.1
代码语言:javascript
复制
pip list | grep -i "docker"
docker                 4.1.0
docker-compose         1.25.0
dockerpty              0.4.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-29 13:59:07

您有两个独立的docker-compose.yaml文件;如果单独启动它们,您就不能在一个文件中的服务和另一个文件中的服务之间具有依赖关系。

按照你写剧本的方式,你正在有效地这样做:

代码语言:javascript
复制
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引用命令行中的两个文件时才能工作,如下所示:

代码语言:javascript
复制
docker-compose -f docker-compose.chronograf.yaml -f docker-compose.influxdb.yaml up

与你的剧本相对应的变化是:

代码语言:javascript
复制
  - 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

代码语言:javascript
复制
- 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

代码语言:javascript
复制
version: "3"

services:
  service1:
    image: docker.io/alpine:latest
    command:
      - sleep
      - inf

docker-compose.service2.yaml

代码语言:javascript
复制
version: "3"

services:
  service2:
    image: docker.io/alpine:latest
    command:
      - sleep
      - inf

跑步:

代码语言:javascript
复制
ansible-playbook playbook.yaml

在以下方面的成果:

代码语言:javascript
复制
$ 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   Up
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73529702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档