Чтобы настроить сервис `nginx` в `docker-compose` для раздачи статических файлов, собранных в другом сервисе, необходимо определить общий volume (том), который будет использоваться обоими сервисами. Перезаписи файлов при этом происходить не должно, если вы правильно настроите volume и не указываете команды в `Dockerfile` или `docker-compose.yml`, которые бы могли изменять файлы в этом томе при перезапуске контейнера.
Для начала, необходимо определить volume в `docker-compose.yml`. Например, если у вас есть сервис, который собирает статические файлы (`static-builder`), и вы хотите раздать эти файлы через сервис `nginx`, конфигурация может выглядеть следующим образом:
```yaml
version: '3.8'
services:
static-builder:
image: your-static-builder-image
volumes:
- static-volume:/path/to/static-files
nginx:
image: nginx:alpine
volumes:
- static-volume:/usr/share/nginx/html:ro
ports:
- "80:80"
volumes:
static-volume:
```
Данная конфигурация выполняет следующие действия:
- Определяет сервис `static-builder`, который соберет статические файлы.
- Определяет service `nginx`, настроенный для обслуживания статических файлов.
- Создает общий volume `static-volume`, который будет подключен к `/path/to/static-files` в контейнере `static-builder` и к `/usr/share/nginx/html` в контейнере `nginx`.
- В случае `nginx`, volume подключен в режиме только для чтения (`:ro`), чтобы предотвратить изменение файлов самим сервером `nginx`.
Немного о кешировании и перезаписи файлов:
- Если вы используете volume для статических файлов, перезапуск сервиса `nginx` сам по себе не должен приводить к перезаписи этих файлов. Файлы будут оставаться неизменными до тех пор, пока их не изменит собирающий сервис (`static-builder`).
- Чтобы изменения статических файлов подхватывались `nginx`, без пересборки контейнера `nginx`, вам необходимо лишь обновить файлы в volume. `nginx` обслуживает файлы из этого volume как есть.
- Важно гарантировать, что сервис `static-builder` не перезаписывает статические файлы непредвиденно. Это может произойти, если, к примеру, процесс сборки статики очищает или перезаписывает файлы в папке сборки при каждом запуске.
Перезапуск сервисов можно выполнять отдельно, и даже при перезапуске сервиса `nginx`, данные в volume `static-volume` останутся неизменными. По умолчанию, Docker-тома являются персистентными и не зависят от жизненного цикла контейнеров, которым они примонтированы.