Обслуживание новых файлов stati c через nginx, хранящихся в контейнере php -fpm после обновления - PullRequest
3 голосов
/ 08 мая 2020

У меня есть следующие контейнеры:

  • nginx:latest
  • myapp контейнер (производный от php -fpm: alpine)

В настоящее время у меня есть фиктивный проект с конвейером CI, который во время сборки компилирует производственный вариант ресурсов (images / js / css, ...). Файлы сборки попадают в (/ public / build). В самом конце конвейера CI я упаковываю все в образы Docker и загружаю их в Hub.

И nginx, и myapp имеют установленный том (без привязки монтирования) и указывают на /opt/ci-test/public/build.

Это работает впервые.

Но допустим, я добавляю новый файл new.css - мою новую версию docker изображения будет содержать вариант сборки new.css.

Запуск нового контейнера с уже существующим томом не обнаруживает новых файлов , и я понимаю, что этого не должно быть. . Могу создать новый том my_app_v2.

На данный момент nginx не видит этот новый том, и его необходимо удалить и повторно запустить (с новым томом), чтобы он вступил в силу.

Есть ли простой способ преодолеть это?

Я намерен использовать контейнер nginx для нескольких приложений PHP, и мне нужно воздерживаться от его уничтожения всякий раз, когда я обновляю одно из обслуживаемых приложений. Это плохое решение?

EDIT:

Один обходной путь, который мне удалось найти, - это удалить все файлы из прикрепленного тома и запустить новый myapp контейнер. Это отражает все последние файлы на томе. Но это кажется грязным ...

EDIT2:

Связанная проблема (случай 3): https://github.com/moby/moby/issues/18670#issuecomment -165059630

EDIT3:

Dockerfile

FROM  php:7.2.30-fpm-alpine3.11

COPY . /opt/ci-test
WORKDIR /opt/ci-test

VOLUME /opt/ci-test/public/build

Пока у меня нет docker-composer, и я запускаю контейнеры вручную с помощью команд:

docker run -it -d --name php71alp -v shr_test:/opt/ci-test/public/build -p 9000:9000 <myaccount>/citest
docker run -it -d --name nginx -v shr_test:/var/www/citest -p 80:80 nginx:latest

Ответы [ 2 ]

1 голос
/ 16 мая 2020

Просто не используйте для этого том.

Вы должны рассматривать docker изображений как «монолитные c пакеты», которые содержат ваши зависимости (nginx) и файлы вашего приложения (изображения, js, css ...). Нет необходимости обрабатывать файлы вашего приложения иначе, чем сам nginx, это все часть единого изображения docker.

Без тома вы запускаете v1 вашего образа, nginx видит файлы v1. Вы запускаете v2 своего изображения, nginx видит файлы v2.

Тома предназначены для использования, когда вы действительно хотите хранить файлы между версиями контейнера (такими как базы данных, загрузка файлов ...). Не для c ресурсов вашего сайта.

Я намерен использовать контейнер nginx для нескольких приложений PHP, и мне нужно воздерживаться от его удаления всякий раз, когда я обновляю одно из служил. Это плохое решение?

Да, это плохой дизайн. Если вы хотите запустить несколько приложений, вы должны запустить 1 Docker контейнер для каждого приложения. Таким образом, когда вы выпускаете новую версию одного приложения, вам нужно только перезапустить этот контейнер. С контейнерами не следует обращаться как с традиционными виртуальными машинами, где вы «S SH в» и настраиваете их вручную. Контейнеры «одноразовые». Новая версия приложения? просто замените контейнер на новый с более новым образом.

1 голос
/ 13 мая 2020

Первый вариант: не использовать том. Если вы хотите, чтобы файлы были доступны из сборки образа и не нуждаются в сохранении, то этот том не помогает в вашем рабочем процессе.

Второй вариант: удалить предыдущий том между запусками и использовать именованный том, который docker инициализируется содержимым образа.

Третий вариант: измените сборку образа и точку входа контейнера, чтобы сохранить каталог в другом месте во время сборки, и восстановите это местоположение в томе на запуск контейнера в точке входа. У меня есть реализация этого в сценариях save-volume и load-volume в моем базовом образе . Ситуация усложняется, когда вы хотите объединить содержимое тома с содержимым хоста, и вам нужно решить, как обрабатывать удаленные файлы и какие изменения сохранять из предыдущих запусков.

...