Происходит перезапись файлов из volume nginx в docker-compose?

Как настроить docker-compose для того, чтобы сервис nginx раздавал статику, собранную в другом сервисе через общий объем, чтобы избежать перезаписи статики при перезапуске nginx?
  • 9 января 2024 г. 5:08
Ответы на вопрос 1
Чтобы настроить сервис `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-тома являются персистентными и не зависят от жизненного цикла контейнеров, которым они примонтированы.
Похожие вопросы