在Windows和Linux上的Dockerfile中使用RUN命令

时间:2019-06-04 04:00:35

标签: linux windows bash docker docker-compose

在我的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? 谢谢

1 个答案:

答案 0 :(得分: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