“dockerfile 解析错误第 1 行需要一个或三个参数”,但我只有 1 个参数

Ame*_*sse 3 docker dockerfile

tl;dr:当我的Dockerfile.

  • 开发环境:WSL 中的 Ubuntu 20.04 LTS (Bash)
  • 构建环境:Windows Server 2019(PowerShell)

我的 Dockerfile 的版本 1:

FROM hello-world:nanoserver-1809
Run Code Online (Sandbox Code Playgroud)

构建命令:

docker build -t hello-world:windows .
Run Code Online (Sandbox Code Playgroud)

输出:

Sending build context to Docker daemon  4.096kB 
Step 1/1 : FROM hello-world:nanoserver-1809
 ---> bb8a46951ebd
Successfully built bb8a46951ebd
Successfully tagged hello-world:windows
Run Code Online (Sandbox Code Playgroud)

--> 这样就可以了!


我的 Dockerfile 的版本 2:

FROM hello-world:nanoserver-1809

WORKDIR tmp
ADD https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs952/gs952w64.exe .
RUN gs952w64.exe /S
Run Code Online (Sandbox Code Playgroud)

构建命令:

docker build -t hello-world:windows .
Run Code Online (Sandbox Code Playgroud)

输出:

Sending build context to Docker daemon  4.096kB 
Error response from daemon: Dockerfile parse error line 1: FROM requires either one or three arguments
Run Code Online (Sandbox Code Playgroud)

--> 这真是出乎意料!


老实说,我很困惑。这是怎么回事?如何编写不会产生意外错误的简单 dockerfile?

Ame*_*sse 5

感谢 David Maze 的评论找到了解决方案。

结果我有Mac行结尾 (CR),这很荒谬,因为我什至没有 Mac。

dos2unix既不想解决unix2dos行尾问题。所以最后我打开了文件nano,并使用 Ctrl+O、Alt+D 以 DOS (CRLF) 行结尾保存它。有了这个,我的Dockerfile工作。

然后我用来dos2unix将行结尾从 CRLF 转换为 LF,该版本也可以工作。

总结一下:

  • CR 行终止符 (Mac):不起作用
  • LF 行终止符 (Linux):有效
  • CRLF 行终止符 (DOS):有效