docker -составить сеть без связи с дочерними контейнерами при остановке родительских контейнеров? - PullRequest
0 голосов
/ 09 января 2020

Это продолжение моего пути создания нескольких docker проектов динамически . Я не упоминал ранее, чтобы сделать этот процесс динамичным, так как я хочу, чтобы разработчики указывали, какой проект они хотят использовать, я использую ansible для увеличения локальной среды.

Logi c is :

  1. выполняется ansible-playbook run.yml -e "{projectsList: ['app-admin']}" - предоставление списка проектов, которые я хочу запустить
  2. остановка существующих основных контейнеров (если они выполняются в предыдущий раз)
  3. Запуск основных контейнеров
  4. Зависит от предоставленного списка проектов, запускает задачи роли () У меня есть отдельная роль для каждого поддерживаемого проекта
  5. остановка существующих дочерних контейнеров проекта (если они выполняются с предыдущего раза)
  6. запустить контейнеры дочернего проекта
  7. сделать некоторые настройки в зависимости от роли

И вот проблема (снова) с сеть, когда я останавливаю основные контейнеры, происходит сбой с сообщением:

ошибка при удалении сети: сеть appnetwork имеет активные конечные точки

это имеет смысл как дочерний docker содержать Пользователи используют одну и ту же сеть, но я пока не вижу способа изменить порядок задач, поскольку я использую роли, поэтому основные задачи docker всегда выполняются перед заданными ролями c задач.

main ansible file:

---
#- import_playbook: './services/old.yml'
- hosts: localhost
  gather_facts: true
  vars:
    # add list of all supported projects, THIS SHOULD BE UPDATED FOREACH NEW PROJECT!
    supportedProjects: ['all', 'app-admin', 'app-landing']
  vars_prompt:
    - name: "ansible_become_pass"
      prompt: "Sudo password"
      private: yes
  pre_tasks:
    # List of projects should be provided
    - fail: msg="List of projects you want to run playbook for not provided"
      when: (projectsList is not  defined) or (projectsList|length == 0)
    # Remove unsupported projects from list
    - name: Filter out not supported projects
      set_fact:
        filteredProjectsList: "{{ projectsList | intersect(supportedProjects) }}"
    # Check if any of projects exist after filtering
    - fail: msg="All project you provided not supported. Supported projects {{ supportedProjects }}"
      when: filteredProjectsList|length == 0
    # Always stop existing docker containers
    - name: stop existing common app docker containers
      docker_compose:
        project_src: ../docker/common/
        state: absent
    - name: start common app  docker containers like nginx proxy, redic, mailcatcher etc. (this can take a while if running by the first time)
      docker_compose:
        project_src: ../docker/common/
        state: present
        build: no
        nocache: no
    - name: Get www-data id
      command: docker exec app-php id -u www-data
      register: wwwid
    - name: Get current user group id
      command: id -g
      register: userid
    - name: Register user and www-data ids
      set_fact:
        userid: "{{userid.stdout}}"
        wwwdataid: "{{wwwid.stdout}}"
  roles:

    - { role: app-landing, when: '"app-landing" in filteredProjectsList or "all" in filteredProjectsList' }
    - { role: app-admin,  when:  ("app-admin" in filteredProjectsList) or ("all" in filteredProjectsList) }

и пример роли app-admin/tasks/mian.yml:

---
- name: Sync {{name}} with git (can take while to clone repo by the first time)
  git:
    repo: "{{gitPath}}"
    dest: "{{destinationPath}}"
    version: "{{branch}}"
- name: stop existing {{name}} docker containers
  docker_compose:
    project_src: "{{dockerComposeFileDestination}}"
    state: absent
- name: start {{name}} docker containers (this can take a while if running by the first time)
  docker_compose:
    project_src: "{{dockerComposeFileDestination}}"
    state: present
    build: no
    nocache: no
- name: Copy {{name}} env file
  copy:
    src: development.env
    dest: "{{destinationPath}}.env"
    force: no
- name: Set file permissions for local {{name}} project files
  command:  chmod -R ug+w {{projectPath}}
  become: yes
- name: Set execute permissions for local {{name}} bin folder
  command: chmod -R +x {{projectPath}}/bin
  become: yes
- name: Set user/group for {{name}} to {{wwwdataid}}:{{userid}}
  command: chown -R {{wwwdataid}}:{{userid}} {{projectPath}}
  become: yes
- name: Composer install for {{name}}
  command: docker-compose -f {{mainDockerComposeFileDestination}}docker-compose.yml exec -T app-php sh -c "cd {{containerProjectPath}} && composer install"

Может быть, есть способ каким-то образом отсоединить сеть, если основной остановка контейнера. Я думал, что когда дочерняя контейнерная сеть установлена ​​как внешняя:

networks:
  appnetwork:
    external: true

решает проблему, но это не так.

1 Ответ

1 голос
/ 09 января 2020

Быстрый эксперимент с внешней сетью:

dc1 / dc1.yml

version: "3.0"

services:
  nginx:
    image: nginx
    ports: 
      - "8080:80"
    networks: 
      - an0

networks:
  an0:
    external: true

dc2 / dc2.yml

version: "3.0"

services:
  redis:
    image: redis
    ports: 
      - "6379:6379"
    networks: 
      - an0

networks:
  an0:
    external: true

Запуск и остановка:

$ docker network create -d bridge an0
1e07251e32b0d3248b6e70aa70a0e0d0a94e457741ef553ca5f100f5cec4dea3

$ docker-compose -f dc1/dc1.yml up -d
Creating dc1_nginx_1 ... done

$ docker-compose -f dc2/dc2.yml up -d
Creating dc2_redis_1 ... done

$ docker-compose -f dc1/dc1.yml down
Stopping dc1_nginx_1 ... done
Removing dc1_nginx_1 ... done
Network an0 is external, skipping

$ docker-compose -f dc2/dc2.yml down
Stopping dc2_redis_1 ... done
Removing dc2_redis_1 ... done
Network an0 is external, skipping
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...