Docker: монтирование / совместное использование одного файла носка? - PullRequest
0 голосов
/ 22 января 2020

Я хочу поделиться php-fpm.sock между nginx и PHP. То, как я это сделал прямо сейчас, выглядит примерно так:

services:
  nginx:
    build:
      context: .
      dockerfile: docker/nginx.docker
    ports:
      - '8080:80'
    volumes:
      - type: volume
        source: php_fpm_sock
        target: /mnt/sock
        consistency: delegated
        read_only: true
        volume:
          nocopy: true
    links:
      - php
    php:
      build:
        context: .
        dockerfile: docker/php.docker
      links:
        - mariadb
      env_file: .env
      volumes:
        - type: volume
          source: php_fpm_sock
          target: /mnt/sock
          consistency: delegated
          read_only: false
          volume:
            nocopy: true
volumes:
  php_fpm_sock:

т.е. я переместил файл носка из его обычного местоположения (/var/run/php5-fpm.sock) в /mnt/sock, потому что не могу понять как монтировать один файл, а я не хочу монтировать весь /var/run dir.

Во-вторых, я настроил php -fpm как:

[www]
listen = /mnt/sock/php-fpm
;listen.owner = www-data
;listen.group = nginx
; php-fpm runs as `www-data`, nginx runs as `nginx`
listen.mode = 0664

, т.е. Я дал «другим» права на полное чтение, потому что пользовательская группа nginx не существует в контейнере php -fpm, поэтому я не знаю, как еще я могу дать разрешения только для nginx.

Все это выглядит довольно забавно. Итак, мои вопросы:

  1. Как я могу поделиться только файлом sock между этими двумя контейнерами, чтобы я мог переместить файл sock обратно в /var/run/php5-fpm.sock
  2. Как я могу исправить разрешения на чтение этого файла, чтобы только nginx мог его прочитать? то есть как можно разделить linux учетные записи пользователей между контейнерами?

Я также могу добавить nginx пользователя в php -fpm изображение,

RUN useradd -r -s /usr/sbin/nologin -c "Nginx service" -U nginx -u 101

И , затем Я могу правильно установить разрешения. UID должен совпадать для обоих изображений, иначе он не будет работать, поэтому я установил его явно. Если бы 101 уже использовалось для PHP, думаю, у меня снова будут проблемы, поэтому я тоже не люблю это решение.

1 Ответ

1 голос
/ 23 января 2020

Вы как бы должны делать это так, как вы показываете. (Но монтировать том поверх /var/run контейнера PHP, вероятно, хорошо.)

У вас есть три больших ограничения:

  1. Крепления монтируют некоторый внешний контент в контейнер (который может быть записан в двух направлениях после запуска), без публикации содержимого.
  2. Docker монтирует том в контейнер до того, как основной процесс контейнера запускается , поэтому все, что вы монтируете, должно уже существовать.
  3. Механизм зависимостей Compose, по сути, обеспечивает порядок, в котором контейнеры создаются , но он не будет ожидать фактического запуска процессов контейнера.

Таким образом, с помощью второго ограничения вы не можете смонтировать сокет PHP -FPM в контейнер PHP, потому что он еще не существует, когда вы используете docker-compose up. И в соответствии с третьим ограничением, вы не можете монтировать сокет в контейнер nginx, потому что он не гарантированно существует в момент создания контейнера. ( Вы также не можете монтировать отдельные файлы из именованных томов , но теоретически вы можете обойти это, подключив каталог хоста привязкой.)

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

Как я могу исправить разрешения на чтение для этого файла, чтобы только nginx мог его прочитать? то есть как можно совместно использовать linux учетные записи пользователей между контейнерами?

Необходимо вручную убедиться, что USER оба контейнера используют одинаковые цифры c ID пользователя. Обратите внимание, что обычно (если не рекомендуется) запускать контейнеры как root, что в любом случае будет обходить любые элементы управления. Нет встроенного способа сделать это.

...