我创建了一个node.js Docker镜像。
在 var_dump($results[0]['type']);
的末尾使用CMD node myapp.js
,它就会启动。
但是当我使用Dockerfile
时,它会失败。
这就是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
但我不明白,因为如果我在Dockerfile中添加standard_init_linux.go:175: exec user process caused "no such file or directory"
,我可以看到该文件存在。
我还尝试在我的脚本中使用完整路径:
RUN ls /root
但没有改变。那可能是什么问题?
答案 0 :(得分:1)
我见过的最常见的错误是在Windows系统上创建start.sh并使用不同的字符编码或包含Windows换行符保存文件。 /bin/bash^M
与/bin/bash
不同,但您不会在Windows上看到该换行符。您还希望以ascii编码保存文件,而不是任何多字符UTF编码。
答案 1 :(得分:1)
使用docker run -entrypoint="/bin/bash" -i your_image
。
您使用的是dockerfile CMD的 shell表单。如文档中所述,默认shell二进制文件为/bin/sh
,而不是/bin/bash
第1行中的预期start.sh
。
或尝试使用 exec表单,即CMD ["/root/start.sh"]
。