Задать вопрос

Как грамотно настроить общий ресурс между контейнерами?

Коллеги, здравствуйте!

# Development configuration
version: "3.7"

services:

  # Php application
  app:
    container_name: rapp.app
    restart: on-failure
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile-dev
    volumes:
      - ./:/www/
      - ./docker/php/log:/var/log
      - ./docker/php/usr/local/etc/php/conf.d:/usr/local/etc/php/conf.d
      - type: bind
        source: ./images
        target: /www/images
    depends_on:
      - db
    links:
      - db
    expose:
      - 9000
    environment:
      PHP_INI_SCAN_DIR: ":/usr/local/etc/php/conf.d"
      TZ: "Europe/Moscow"

...

  # Nginx api admin server
  nginx-images:
    container_name: rapp.nginx-images
    restart: on-failure
    image: nginx:latest
    volumes:
      - ./docker/nginx/dev/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/dev/sites-enabled/vhost-images.conf:/etc/nginx/sites-enabled/vhost-images.conf
      - type: bind
        source: ./images
        read_only: true
        target: /www/images
    ports:
      - 127.0.0.100:8013:80
    depends_on:
      - app
    expose:
      - 80
    command: ["nginx", "-g", "daemon off;"]


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

Но проблема в том, что сервис nginx-images блокирует файл и я не могу изменить его из сервиса app

Получаю сообщение об ошибке.

Warning: unlink(/www/images/1/categories/385d87d3d566437ca99b1161e93d78db-5e406295b30e1.jpeg): Device or resource busy


Есть вероятность что дело не в конфигурации, а nginx что-то делает с моим файлом.
  • Вопрос задан
  • 973 просмотра
Подписаться 6 Простой 22 комментария
Решения вопроса 1
IgorPI
@IgorPI Автор вопроса
Из документации

Тома, преимущества использования.

  • Резервное копирование
  • Управление с помощью Docker CLI
  • Тома работают как на Linux, так и на Windows контейнерах.
  • Тома можно более безопасно разделить между контейнерами
  • Драйверы томов позволяют хранить тома на удаленных хостах или в облаке, шифровать содержимое томов или добавлять другие функции.


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

Что касается моей проблемы.
Да, действительно, как я и предполагал в самом начале, nginx блокировал файл.

Отдельное спасибо пользователю Сергей
Его комментарии

Игорь, ну, так, очевидно, что nginx блокирует файл. Как именно - не знаю, это зависит от файловой системы и тех операций, что выполняет nginx. То же самое было бы и без докера, будь эти сервисы соседями на одном сервере.
-------------------------------------------------------------------------------
Я бы начал с "open_file_cache off" в конфиге nginx

Попал в самое сердце проблемы.

Параметр open_file_cache по умолчанию имеет значение off
Но в моём случае он был включен и мел параметры отличные от off

Что касается самого параметра open_file_cache
Синтаксис: open_file_cache off;
open_file_cache max=N [inactive=время];
Умолчание:
open_file_cache off;
Контекст: http, server, location
Задаёт кэш, в котором могут храниться:

  • дескрипторы открытых файлов
  • информация об их размерах и времени модификации
  • информация о существовании каталогов


Всем спасибо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы