Docker在Windows上出现"$'\r': command not found"错误

20

我目前在我的本地(Windows 10)机器上拥有以下Docker设置,以运行一个MySQL 5.7容器:

builds/Dockerfile:

# Base image
FROM mysql:5.7

# Copy starting scripts file
COPY start.sh /root/start.sh

RUN sed -i 's/\r$//' /root/start.sh

# Run necessary services
CMD ["/bin/bash", "/root/start.sh"]

构建/启动脚本

#!/bin/sh

cp /etc/mysql/conf.d/temp/* /etc/mysql/conf.d/

/entrypoint.sh mysqld

docker-compose.yml

docker-compose.yml

version: '2'

services:
   db:
     build: ./builds
     container_name: mysql1
     environment:
       MYSQL_ROOT_HOST: '%'
       MYSQL_ROOT_PASSWORD: "test2"
     ports:
       - "13306:3306"
     volumes:
       - ./containerdata:/etc/mysql/conf.d/temp

容器数据:
...包含一个MySQL my.cnf文件,可以自定义绑定,允许从主机等处连接...

这个设置在我另一台Linux机器上完美运行(运行docker-compose up时),但在这台Windows机器上失败,并出现以下错误:

mysql1 | /root/start.sh: line 2: $'\r': command not found
mysql1 | cp: cannot stat '/etc/mysql/conf.d/temp/*': No such file or directory
mysql1 | /root/start.sh: line 4: $'\r': command not found
: not foundntrypoint.sh: line 215: exec: mysqld
mysql1 exited with code 127

如您所见,我甚至尝试使用“sed”来替换所有的'\r'(即使当我用Notepad++打开start.sh文件时,行结尾已经是Unix-LF并且没有'\r')。即使这样,仍然会出现上述错误。

您能帮我解决这个问题吗?感谢您提前的任何帮助。

编辑:我已经在Dockerfile中使用了“Linux容器”,还尝试了dos2unix而不是sed。

7个回答

14
我曾遇到同样的问题,发现这个错误是由Windows专用字符引起的。为了解决这个问题,请使用nano或其他Linux文件编辑器编写shell脚本。
如果您使用Windows 10,则可以启动子系统 Linux来编写shell脚本。
希望对您有所帮助。

12
另一种解决方案是将行分隔符号更改为 LF(Unix 样式),大多数集成开发环境或文本编辑器应该都能够实现。 - m-dz
11
例如,在Visual Studio Code中,您可以将行分隔符号的类型从CRLF更改为LF。按F1并输入“Change End of Line Sequence”。 - Carlos Henrique

9

我可以通过在Notepad++中将LF更改为Unix而轻松地做到这一点。 打开文件并查看右下角。 您会看到“Windows(CRLF)”,将其更改为“Unix(LF)”,这将解决问题。


6

在从主项目存储库进行git pull更新后,我在Windows机器上遇到了类似的问题。为了解决它,我在我的存储库根目录放置了一个.gitattributes文件,并添加了以下行:

*.sh    text eol=lf

实际上,它禁止了git根据当前操作系统更改*.sh文件中的EOL符号。


这个作为一种预防措施非常有效,谢谢。 - Ronan

3

使用Notepad++将您的.sh文件的行尾(EOL)编辑为LF(Unix)

Edit -> EOL Conversion -> Unix (LF)

1

最近我们遇到了一个非常类似的问题:'\r': command not found。这个问题开始出现在升级到最新版Docker Desktop(4.12.0)的人身上。无论怎么调整行尾字符,都没有帮助。降级回到4.10.1可以解决这个问题。


我也遇到了同样的问题(v4.13.0)。会尝试降级。 - Gonzalo Gallotti

0
我遇到了$'\r': command not found的问题,因为在推送和拉取Git后,换行符变成了Windows的CRLF。你可以在IntelliJ右下角进行更改。

enter image description here

你需要重建你的 Docker Compose

docker compose -f docker/docker-compose.yml -p my-project build


0
对于我在Windows上解决这个问题的方法是在PyCharm中编辑行尾设置。我不需要降级Docker(我使用的是4.13.0版本)。
请转到文件 > 文件属性 > 行分隔符 > 选择LF。
希望能对你有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接