为什么我的docker-cmd不能用sh执行?

CMD [“./run-nginx.sh”]脚本不执行并引发混乱:standard_init_linux.go:175:exec用户进程导致“exec格式错误”[恢复] 。 为什么这样? 你能帮忙:(我的机器是win10和docker版本:docker版本1.12.3,

Dockerfile

FROM nginx ADD run-nginx.sh /usr/app/src/ ADD setup-index-page.sh /usr/app/src/ WORKDIR /usr/app/src/ RUN chmod +x run-nginx.sh RUN chmod +x setup-index-page.sh CMD ["./run-nginx.sh"] 

run-nginx.sh

 #!/usr/bin/env bash ./setup-index-page.sh exec nginx -g 'daemon off;' 

setup-index-page.sh

 #!/usr/bin/env bash container_id=${hostname} color=${container_id:0:6} echo "<body>Serving you from container id: ${hostname}</body>" > /usr/share/nginx/html/index.html 

响应

 panic: standard_init_linux.go:175: exec user process caused "exec format error" [recovered] panic: standard_init_linux.go:175: exec user process caused "exec format error" 2017-01-01T06:48:38.776636000Z goroutine 1 [running, locked to thread]: panic(0x88f8a0, 0xc820136a10) 

鉴于您将音量从Windows映射到Linux,很可能您的* .sh文件具有Windows样式(CRLF)行尾。 如果将它们转换为Unix / Linux风格(LF),则应该可以。

我不确定在Windows上的正确工具检查和修复行结束,但记事本+ +应该能够做到这一点。

我在我的系统上用linux docker后端testing了你的代码(实际上是osx,所以docker后端操作系统正在运行是没有问题的),它工作正常(尽pipe我没有得到一个容器ID)。 我认为你的问题是,你已经在你的Windows环境中configurationdocker运行Windows容器,而不是Linux。

如果您使用脚本作为您的容器的入口点,它可能以某种方式将DOS回车符添加到行的末尾。 因此,你的shebang将在Linux shell中显示为#!/bin/bash^M ^M可能看不到^M 要看到它,运行:

 vim -U NONE -u NONE filename 

要删除它,从vim内运行:

 :%s/\r//g 

注意:确保先用上面的选项运行vim。

最常见的原因是在Windows中编辑文件。 但是,如果通过运行catdocker exec以及-t标志来创build文件,也会发生这种情况。 -t标志导致在TTY模式下执行,在行的末尾打印DOS回车符。 而是运行没有任何标志:

 docker exec mycontainer cat /path/to/file > file_on_host