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)
答案 0 :(得分:3)
鉴于您正在将卷从Windows映射到Linux,您的* .sh文件很可能具有Windows样式(CRLF)行结尾。如果你把它们转换成Unix / Linux风格(LF),它应该没问题。
我不确定在Windows上检查和修复行结尾的正确工具,但Notepad ++应该能够做到。
答案 1 :(得分:1)
我使用linux docker后端在我的系统上测试了你的代码(实际上是osx,因此毫无疑问,docker后端操作系统正在运行),并且它工作正常(尽管我没有得到一个容器ID)。我认为你的问题是你已经在windows环境中配置了docker来运行windows容器,而不是linux。
答案 2 :(得分:0)
如果您使用脚本作为容器的入口点,它可能会以某种方式将DOS回车添加到行的末尾。因此,您的shebang将在Linux shell中显示为#!/bin/bash^M
。 ^M
在vim中可能是不可见的。要查看它,请运行:
vim -U NONE -u NONE filename
要从vim run中删除它:
:%s/\r//g
注意:请务必先使用上述选项运行vim。
最常见的原因是在Windows中编辑文件。但是,如果您通过使用cat
和docker exec
标志运行-t
来创建文件,也会发生这种情况。 -t
标志导致在TTY模式下执行,该模式在行的末尾打印DOS回车符。而是在没有任何标志的情况下运行:
docker exec mycontainer cat /path/to/file > file_on_host