Docker: mounting/sharing 单个 sock 文件?

Docker: mounting/sharing a single sock file?

我想在 nginx 和 PHP 之间共享 php-fpm.sock。我现在这样做的方式是这样的:

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:

即我已将 sock 文件从其常用位置 (/var/run/php5-fpm.sock) 移至 /mnt/sock,因为我不知道如何挂载单个文件并且我不想挂载整个 [=18] =] 目录

其次,我将 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

即,我已授予 "other" 完全读取权限,因为 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 我想我会再次遇到麻烦,所以我也不喜欢这个解决方案。

你有点必须按照你展示的方式去做。 (但是将卷安装在 PHP 容器的 /var/run 上可能没问题。)

这里有三大限制:

  1. Mounts 正在将一些外部内容 装载到 容器中(启动后可以双向写入),而不是将内容发布出去。
  2. Docker 在主容器进程启动前 将卷装载到容器中 ,因此您要装载的内容必须已经存在。
  3. Compose 依赖机制本质上强制执行创建容器的顺序,但它不会等待容器进程实际启动。

所以根据第二个约束,你不能将 PHP-FPM 套接字挂载到 PHP 容器中,因为当你 运行 时它还不存在宁docker-compose up。根据第三个约束,您也不能将套接字挂载到 nginx 容器中,因为不能保证它在容器创建时就存在。 ( 也一样,但理论上您可以通过绑定挂载主机目录来解决此问题。)

由于容器只有 运行 一个进程,因此 /var/run 中可能没有其他任何东西,并且根据其性质,无论如何用一个空卷隐藏那里的所有东西应该没问题。您可能唯一需要手动管理的是 pid 文件。

How can I fix the read permissions on this file so that only nginx can read it? i.e. how can share linux user accounts across containers?

您需要手动确保 USER 两个容器使用的数字用户 ID 相同。请注意,运行 容器作为 root 是很常见的(如果不鼓励的话),无论如何都会绕过这里的任何控制。没有内置方法可以执行此操作。