本文最后更新于 2024-08-08,文章内容可能已经过时。

Docker挂载权限问题

问题描述

使用docker挂载mysql下的/var/lib/mysql目录时碰到了个小问题,挂载到我系统自己的e盘内,会出现容器无限重启的情况,查看容器日志发现无法正常初始化,猜想是目录权限问题

解决方案

  1. 挂载到WSL子系统内,不挂载到主硬盘,列如在子系统根目录下创建一个目录:mkdir /db 然后在挂载到子系统目录就行了
  2. 升级到WSL2,使用9p协议,缺点就是会增加性能开销,因此,如果只需要在WSL内部进行操作,则最好将数据存储在WSL文件系统中。

# Docker中部署PHP-FPM出现"File not found."的问题

问题描述

使用wsl搭建docker开发环境时,碰到了这个问题,看了下nginx日志,发现报错:FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream 于是确定是通过FastCGI调用PHP-FPM时,传递的文件名有误。这就涉及到PHP的工作原理了:Nginx提供 HTTP服务,对于客户端对PHP文件的请求,Nginx将构造一个对应的CGI调用,通过配置的TCP套接字或者Unix 套接字,将请求发送给PHP。请求中有一个参数SCRIPT_FILENAME标识了客户端请求的脚本文件的本地 路径。由于我将PHP环境放在了Docker内部,PHP通过Docker Volume访问重定向后的本机路径,这个路径 和外部的Nginx看到的路径不一样,从而导致了Nginx能看到这个PHP脚本文件、而PHP不能。

解决方案

在php容器内挂载和nginx /usr/share/nginx/html相同的目录,让php和nginx两个容器下的程序文件目录保持一致,两个容器都可以读取到文件:

# docker-compose.yml配置[挂载部分]:
nginx:
  volumes:
    - /程序文件目录/wwwroot:/usr/share/nginx/html #文件目录`
php:
  volumes:
    - /程序文件目录/wwwroot:/usr/share/nginx/html  #和上面保持一致
# conf.d/default.conf 文件配置
server {
    listen 80;
    listen [::]:80;
    server_name localhost;

    access_log /var/log/nginx/host.access.log main;
    root /usr/share/nginx/html; #配置项目根目录
    location / {
        index index.php index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}