Php 为什么Mac OSX在使用Docker Desktop for Mac时仍然不区分大小写
我正在使用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文件: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中失败的原因是因为实时环境的大小写敏感性
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: