You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "该文件换行符正常"
    
  • 修复方法:

    1. 在Windows编辑器(如VS Code)中打开问题文件,将换行符设置为LF(右下角可切换)后保存。
    2. 或在容器内直接转换:
      sed -i 's/\r$//' 问题文件路径
      

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:40:49