无法使用shell脚本启动节点应用程序

我创build了一个node.js的Docker镜像。 在我的Dockerfile的末尾使用CMD node myapp.js ,它启动。 但是当我使用CMD /root/start.sh ,则失败。

这就是我的start.sh

 #!/bin/bash node myapp.js 

这里是我的Dockerfile的重要行:

 FROM debian:latest COPY config/start.sh /root/start.sh RUN chmod +x /root/start.sh WORKDIR /my/app/directory RUN apt-get install -y wget && \ wget https://nodejs.org/dist/latest-v5.x/node-v5.12.0-linux-x64.tar.gz && \ tar -C /usr/local --strip-components 1 -xzf node-v5.12.0-linux-x64.tar.gz && \ rm -f node-v5.12.0-linux-x64.tar.gz && \ ln -s /usr/bin/nodejs /usr/bin/node # works: CMD node myapp.js # doesn't work: CMD /root/start.sh 

使用docker logs我得到: standard_init_linux.go:175: exec user process caused "no such file or directory"但我不明白,因为如果我在我的Dockerfile添加RUN ls /root ,我可以看到文件存在。 我也试过在我的脚本中的完整path:

 #!/bin/bash /usr/bin/node /my/app/directory/myapp.js 

但没有任何改变。 那么问题是什么?

使用docker run -entrypoint="/bin/bash" -i your_image

你使用的是dockerfile CMD的shellforms 。 如文档中所述,默认的shell二进制文件是/bin/sh ,而不是您在start.sh第1行中预期的/bin/bash

或者尝试使用exec表单 ,即CMD ["/root/start.sh"]

我见过的最常见的错误是在Windows系统上创buildstart.sh文件,并使用不同的字符编码或包括Windows换行符来保存文件。 /bin/bash^M/bin/bash但在Windows上不会看到换行符。 您还希望以ascii编码保存文件,而不是任何多字符UTF编码。