Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么Mac OSX在使用Docker Desktop for Mac时仍然不区分大小写_Php_Linux_Macos_Docker_Autoload - Fatal编程技术网

Php 为什么Mac OSX在使用Docker Desktop for Mac时仍然不区分大小写

Php 为什么Mac OSX在使用Docker Desktop for Mac时仍然不区分大小写,php,linux,macos,docker,autoload,Php,Linux,Macos,Docker,Autoload,我正在使用Docker Desktop for Mac在本地环境中封装一个基本的LAMP堆栈,然后定期使用Bitbucket管道将一个简单的MVC应用程序部署到共享Linux服务器 除路由器外,一切正常。在prod中,自动加载会失败,因为Linux环境会区分路由、App/Controllers/Posts和App/Controllers/Posts。我意识到,为了让PSR-4自动加载工作,每个文件夹/名称空间和文件/类的大小写都必须匹配,显然,它在prod中失败的原因是因为实时环境的大小写敏感性

我正在使用Docker Desktop for Mac在本地环境中封装一个基本的LAMP堆栈,然后定期使用Bitbucket管道将一个简单的MVC应用程序部署到共享Linux服务器

除路由器外,一切正常。在prod中,自动加载会失败,因为Linux环境会区分路由、App/Controllers/Posts和App/Controllers/Posts。我意识到,为了让PSR-4自动加载工作,每个文件夹/名称空间和文件/类的大小写都必须匹配,显然,它在prod中失败的原因是因为实时环境的大小写敏感性突出了这种不匹配

然而,使用Docker的明显原因是为了避免在本地和prod环境中出现这些不同的行为。是不是在Mac上使用Docker肯定不会表现出区分大小写的特性,即使是在基于Ubuntu映像的容器中,这样我就可以在本地了解这些问题,而无需在prod中进行测试?Github上提出的一个问题(早在2016年)表明,由于Mac的“osxfs”,这是不可能的。然而,当查看Mac docs()的Docker时,它似乎应该注意到这一点;特别是:

默认情况下,Mac文件系统不区分大小写,而Linux区分大小写。在Linux上,可以创建两个单独的文件:test和test,而在Mac上,这些文件名实际上会引用相同的底层文件。这可能会导致应用程序在Mac上正常工作(文件内容共享)时出现问题但在Linux生产环境中运行时失败(文件内容不同)。为了避免这种情况,Docker Desktop坚持所有共享文件都将作为原始案例进行访问。。因此,如果创建一个名为test的文件,则必须将其作为test打开

(由我加粗)

这是否表明应显示区分大小写,或者我是否错误地读取了文档?请注意,以下是我的Dockerfile和docker compose文件:

FROM php:7.4-apache

RUN a2enmod rewrite

RUN apt-get update
RUN apt-get install git -y
RUN apt-get install -y libzip-dev zip

RUN docker-php-ext-install pdo pdo_mysql

RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

WORKDIR /var/www/developmental

COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

提前非常感谢(简单一点-我是Docker新手,这是我的第一个Stackoverflow问题!)

因为您要绑定将目录从主机装载到容器中,所以主机文件系统可能会出现任何异常情况;例如,您引用的关于MacOS上不区分大小写的段落

使Docker映像自包含通常更好:编写一个Docker文件,将所有必需的应用程序代码
复制到映像中,并完全避免这种绑定装载。如果这样做,则应用程序代码将仅位于区分大小写的Linux文件系统中。如果需要更正文件名的大小写,可以
例如,运行mv foo foo

Dockerfile中的
#
...
WORKDIR/var/www/developmental
复制
docker-compose.yml中的
#
服务:
php:
建造:
上下文:。
dockerfile:./.docker/dockerfile
端口:
- 8080:80
#并删除`卷:`

卷:
绑定装载是主机系统的传递,因此您可能会遇到这样的问题。将代码复制到映像中并删除绑定装载会更可靠;然后容器文件系统将完全在Linux空间中。感谢@DavidMaze,这已解决了此问题。感谢anation。我删除了卷装载,并通过Dockerfile将应用程序代码复制到映像中,解决了OSX/Linux区分大小写差异的问题。但是,在我之前的评论之后,我意识到我需要共享卷,以便可以看到反映的代码更改(通过主机上的IDE进行)无需重建容器。唯一的解决方法(就我的新手知识而言)是从容器中运行IDE…除非我缺少什么。。。
version: "3.8"

services:
  php:
    build:
      context: .
      dockerfile: ./.docker/Dockerfile
    ports:
      - 8080:80
    volumes:
      - .:/var/www/developmental

  db:
    image: mysql/mysql-server
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3308:3306
    environment:
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
    volumes:
      - db-data:/var/lib/mysql
      - ./data:/docker-entrypoint-initdb.d

volumes:
  db-data: