Docker文件含错误换行符:如何排查Phinx报错的问题文件?
问题描述
在Windows 10系统上使用Docker搭建开发环境,采用php:8.2.2-apache、mysql:8.0.32、composer:2.5.3及phpMyAdmin:5.2.1镜像。在composer.json中添加robmorgan/phinx 0.13后,先在容器终端执行vendor/bin/phinx init成功生成phinx.php文件,停止容器后修改该文件以读取.env配置值,重启容器后执行vendor/bin/phinx create <name>时出现报错:
usr/bin/env: 'php\r': No such file or directory
已知这是文件使用Windows换行符(CRLF)而非Unix换行符(LF)导致,但无法确定受影响的文件,求排查定位方法。
相关配置文件
docker-compose.yml
version: '3.9' services: webserver: build: ./docker image: -redacted- ports: - "80:80" - "443:443" volumes: - ./www:/var/www/html links: - db db: image: mysql:8.0.32 ports: - "3306:3306" volumes: - ./database:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} composer: image: composer:2.5.3 command: ["composer", "install"] volumes: - ./www:/app phpmyadmin: depends_on: - db image: phpmyadmin:5.2.1 restart: always ports: - 8080:80 environment: PMA_HOST: db
phinx.php
<?php $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $databaseName = $_ENV['MYSQL_DATABASE']; $username = $_ENV['MYSQL_USER']; $password = $_ENV['MYSQL_PASSWORD']; return [ 'paths' => [ 'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations', 'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds' ], 'environments' => [ 'default_migration_table' => 'phinxlog', 'default_environment' => 'development', 'production' => [ 'adapter' => 'mysql', 'host' => 'localhost', 'name' => $databaseName, 'user' => $username, 'pass' => $password, 'port' => '3306', 'charset' => 'utf8', ] ], 'version_order' => 'creation' ];
启动Docker命令:docker-compose --env-file=./www/.env up
排查定位及解决方法
优先检查phinx执行脚本:报错里的
php\r说明脚本的shebang行(第一行#!/usr/bin/env php)带有Windows换行符。进入容器终端执行以下命令查看:cat -v vendor/bin/phinx | head -1如果输出显示
#!/usr/bin/env php^M,则这个文件就是问题所在。批量排查可执行脚本:如果上面的文件没问题,可批量检查
vendor/bin/下所有可执行文件:find vendor/bin/ -type f -exec cat -v {} | grep -l "^#\!/.*\^M" \;该命令会列出所有shebang行带有Windows换行符的文件。
验证修改过的phinx.php:虽然报错未直接指向它,但你修改过该文件,也可以检查:
cat -v phinx.php | grep -q "\^M" && echo "该文件包含Windows换行符" || echo "该文件换行符正常"修复方法:
- 在Windows编辑器(如VS Code)中打开问题文件,将换行符设置为LF(右下角可切换)后保存。
- 或在容器内直接转换:
sed -i 's/\r$//' 问题文件路径
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

