Это продолжение моего пути создания нескольких docker проектов динамически . Я не упоминал ранее, чтобы сделать этот процесс динамичным, так как я хочу, чтобы разработчики указывали, какой проект они хотят использовать, я использую ansible для увеличения локальной среды.
Logi c is :
- выполняется
ansible-playbook run.yml -e "{projectsList:
['app-admin']}"
- предоставление списка проектов, которые я хочу запустить - остановка существующих основных контейнеров (если они выполняются в предыдущий раз)
- Запуск основных контейнеров
- Зависит от предоставленного списка проектов, запускает задачи роли () У меня есть отдельная роль для каждого поддерживаемого проекта
- остановка существующих дочерних контейнеров проекта (если они выполняются с предыдущего раза)
- запустить контейнеры дочернего проекта
- сделать некоторые настройки в зависимости от роли
И вот проблема (снова) с сеть, когда я останавливаю основные контейнеры, происходит сбой с сообщением:
ошибка при удалении сети: сеть 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
решает проблему, но это не так.