【问题标题】:Using RUN command in Dockerfile on Windows and Linux在 Windows 和 Linux 上的 Dockerfile 中使用 RUN 命令
【发布时间】:2019-10-19 14:06:40
【问题描述】:

在我的 Dockerfile 中有

FROM microsoft/dotnet:2.1-sdk
COPY devops/scripts/setup.sh .
RUN ls
RUN chmod +x ./setup.sh 
RUN ./setup.sh
WORKDIR /app

第 3 步我只是用来显示该文件确实存在。

在 docker-compose 中使用时,它在 Linux 上完美运行,但在 Windows 上运行 docker-compose up 时会导致

> docker-compose up
Building create_template
Step 1/6 : FROM microsoft/dotnet:2.1-sdk
 ---> 511c1f563ce6
Step 2/6 : COPY devops/scripts/setup.sh .
 ---> 3d3bb4ab9bc4
Step 3/6 : RUN ls
 ---> Running in 43ad6e244ed8
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
setup.sh     <--- 
srv
sys
tmp
usr
var
Removing intermediate container 43ad6e244ed8
 ---> aa32210d6a87
Step 4/6 : RUN chmod +x ./setup.sh
 ---> Running in 2d6858495355
Removing intermediate container 2d6858495355
 ---> 5e0388623851
Step 5/6 : RUN ./setup.sh
 ---> Running in abb3a52fe6ec
/bin/sh: 1: ./setup.sh: not found
ERROR: Service 'create_template' failed to build: The command '/bin/sh -c ./setup.sh' returned a non-zero code: 127

有没有办法在两个系统上使用相同的 dockerimage 文件和命令,或者我必须为每个系统使用备用 dockerimage 和 docker-compose? 谢谢

【问题讨论】:

  • 你的setup.sh的shebang行是什么?如果它使用的是图像中不存在的解释器(例如,您使用的是 #! /bin/bash 并且图像中没有 bash),您可能会收到 not found 错误。
  • 如果您的 docker 在 Windows 10 上使用 WSL:docs.microsoft.com/en-us/windows/wsl/install-win10 运行,您可以运行 shell 脚本。否则你可以试试cygwin。不是很优雅,但它可以工作......

标签: linux windows bash docker docker-compose


【解决方案1】:

我在 Windows 上尝试了您的示例并重现了您的问题。

根本原因是当您在 Windows 上新建文件 setup.sh 时,它是 DOS format。在撰写或构建之前,您需要使用 git-bash 或其他类似方法将主机上的文件格式提前传输到unix format,例如:

dos2unix setup.sh

另一种方法是在Dockerfile 中进行,并且在您使用linux主机时也可以兼容,类似于下一个:

RUN apt-get update && apt-get install -y dos2unix && dos2unix setup.sh
RUN ./setup.sh

【讨论】:

  • 太好了,感谢您提供的信息,这只是关于 (CR LF) 与 (LF) 的关系吗?关于找不到文件的错误消息非常具有误导性
  • 是的,只是 CRLF 问题。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2016-05-30
  • 2018-10-13
相关资源
最近更新 更多