Как разделить содержимое одной папки между двумя docker контейнерами и разрешить одному из них удалять и записывать в общую папку? - PullRequest
0 голосов
/ 03 февраля 2020

Я создаю среду разработки для проекта ionic / Angluar с docker. Где Nodejs - это изображение для просмотра и построения www файлов из кода sr c на хост-компьютере (локальный код sr c) (с ng build --watch --poll=2000), а NGINX изображение должно получить сгенерированные www folder.

Я испробовал два подхода для этого варианта использования, и оба не удалось:

  • Подход № 1: Я связал подключил папку к обоим контейнерам: Проблема здесь заключалась в том, что Контейнеру NGINX не удалось синхронизировать / получить файл из www на хосте. Хотя контейнеру NodeJS удается сгенерировать файлы и синхронизировать c с каталогом хоста www. Причина: NGINX теряет монтирование привязки, когда NODEJS удаляет и восстанавливает каталог www.
  • Подход № 2: Я использовал тома данных: Но при запуске контейнера NodeJS происходит сбой, поскольку он не может удалить этот файл www для его регенерации с новыми вложенными файлами www (поскольку он заблокирован). на NGINX). Сообщение об ошибке:
frontend        | EBUSY: resource busy or locked, rmdir '/home/frontend/www'
frontend        | Error: EBUSY: resource busy or locked, rmdir '/home/frontend/www'
frontend        |     at Object.rmdirSync (fs.js:752:3)
...

Файл составления выглядит следующим образом: (Я отметил вышеупомянутые подходы в файле составления, но, конечно, я использую их по одному за раз)

version: "3.7"

services:
  web-server:
    image: webserver-nginx:latest
    container_name: webserver
    build:
      context: ../nginx/
      dockerfile: Dockerfile-nginx    
    ports:
    - "80:80"
    volumes:
    - /my_host_machine/www:/usr/share/nginx/html:ro # approach number 1
    - www:/usr/share/nginx/html/afv:ro # approach number 2
    depends_on:
      - frontend

  frontend:
    image: frontend-angular:latest
    container_name: frontend
    build:
      context: /foo/
      dockerfile: Dockerfile-nodejs-frontend
    volumes:
      - /my_host_machine/www:/home/frontend/www # approach number 1
      - www:/home/frontend/www # approach number 2

volumes:
  www:

Может ли кто-нибудь мне помочь или у него есть предложение или обходной путь?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Оказалось, что проблема была в следующем:

Я использовал подход # 1

Эта проблема возникает только в точке инициализации, где NODEJS удаляла папку www после NGINX поддерживает привязку к нему. Перезапуск контейнера NGINX после того, как NODEJS завершит создание папки и файлов www, решит проблему, даже если NODEJS впоследствии восстановит веб-файлы (потому что он не удалит всю папку целиком).

Вместо того, чтобы каждый раз перезапускать NGINX вручную, я использовал HealthCheck и контейнер для автоматического заживления. (Обратите внимание, что если вы используете рой, вам не понадобится контейнер для автоматического лечения)

Вот как я это сделал:

Создайте healthcheck.sh, где Dockerfile:

#!/bin/bash
if [ -z "$(ls -A /path/to/mounted/file/in/NGINX/container)" ]; then exit 1; else exit 0; fi

добавить эти строки в NGINX Dockerfile:

COPY healthcheck.sh .

HEALTHCHECK --interval=3s --retries=10 CMD sh /healthcheck.sh

добавить эти строки в docker -compose.yml:

autoheal:
image: willfarrell/autoheal
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
  AUTOHEAL_CONTAINER_LABEL: all
restart: always
0 голосов
/ 07 февраля 2020

Я думаю, ваш первый вариант почти выполним. Попробуйте взять этот подключенный каталог bind и создать в нем подкаталоги для www, а другой - для исходного кода. Выполните сборку одного контейнера из исходного каталога и переместите результат в каталог www, где он будет выбран другим контейнером (без удаления всего каталога).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...