romash
@romash
web-разработчик

Почему нельзя примонтировать в контейнер папку из другого контейнера?

Запускаются два контейнера, nginx и php-fpm.
Исходники (php файлы, ассеты, загруженные пользователями файлы) находятся в php-fpm в папке /app и nginx должен их видеть.
Лучшее, что смог накопать в сети, это сделать общий volume и при запуске контейнера php копировать всё из /app в этот volume. Но, во-первых, это дичь какая-то, потому что папка /app весит дофига (так серьёзно кто-то живёт?), а во-вторых, загружаемые пользователями файлы nginx не увидит.
Неужели нет никакого способа создать volume, который будет монтировать папку не с хоста, а из контейнера?

UPD Пример.
Первый контейнер:
docker build -t image -f Dockerfile .
docker run -d --name container1 -v app:/app image

Dockerfile
FROM alpine:3.9
WORKDIR /app
COPY index.html script.sh ./
CMD ["script.sh"]

index.html
<h1>Hello, Docker!</h1>

script.sh

Скрипт, который в бесконечном цикле создаёт и изменяет файлы и папки в текущей директории, может что-нибудь скачивает из интернета, синхронизируется с какими-нибудь сервисами, неважно, главное, что файлы в /app меняются.


Второй контейнер:
docker volume create shared
docker run -d --name container2 -p 80:80 -v shared:/usr/share/nginx/html:ro nginx:1.13


И вот почему нельзя сделать так, чтобы volume, пробрасываемый в container2 был создан на основе папки в container1 и следил за её изменениями?
  • Вопрос задан
  • 583 просмотра
Пригласить эксперта
Ответы на вопрос 2
POS_troi
@POS_troi
СадоМазо Админ, флудер, троль.
Вынесите данные из контейнера и будет вам счастье, ну заодно позаботьтесь чтобы у вас два контейнера не решили сделать запись в один файл одновременно.
Ответ написан
Inlore
@Inlore
Этап 1. Stateless
Собирайте один образ для обоих контейнеров nginx и php-fpm, в котором у вас будет находится код самого приложения в /app и будут установлены нужные пакеты. Здесь у вас должны быть только не изменяемые во время работы приложения данные. Запускаете оба контейнера, просто для одного точкой входа будет nginx, а для другого php-fpm. Вдвоём места на диске они будут занимать только по размеру образа, т.к. это будет один и тот же readonly-слой
Этап 2. Statefull
Все данные, которые изменяются во время работы приложения, должны жить в отдельном хранилище, которое будет подключаться к обоим контейнерам куда-нибудь в /app/storage, будь это просто named volume, какой-нибудь rbd ceph или s3 хранилище (в этом случае nginx туда отправляет просто через определённые для таких данных location)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы