未findDocker映像入口点脚本

我有一个Dockerfile

 FROM frolvlad/alpine-oraclejdk8:slim ADD build/libs/zuul*.jar /app.jar ADD src/main/script/startup.sh /startup.sh EXPOSE 8080 8999 ENTRYPOINT ["/startup.sh"] 

startup.sh看起来像:

 #!/bin/sh set -e if [ $# -eq 0 ] then echo "Environment value required" exit 1 fi java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml -Djava.security.egd=file:/dev/./urandom -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=8999 app.jar 

但是当我用docker: Error response from daemon: Container command '/startup.sh' not found or does not exist..运行它时,我得到了docker: Error response from daemon: Container command '/startup.sh' not found or does not exist.. shell脚本具有执行权限。

我用同样的方式来运行我的其他应用程序,他们都工作正常。 我在Mac中写了这些文件,并试图在Linux机器上运行该容器。

原来是导致问题的^M DOS风格的行尾字符。 但是,因为我在Mac中编辑,我用vim检查了几次,我很确定我的本地机器中的启动脚本没有该字符。 但是当在容器内用vim打开时,我可以在任何地方看到^M 所以不知何故,字符被添加到startup.sh复制到图像时,这是奇怪的。 这可以防止脚本被调用。

解决方法是在Dockerfile中的ENTRYPOINT之前添加dos2unix filename 。 但请确保您的基本映像具有该实用程序。

shell脚本具有执行权限。

你确定吗? (我的意思是容器内,加上ADDED)
可以肯定的是,我会使用Dockerfile:

 EXPOSE 8080 8999 COPY src/main/script/startup.sh /startup.sh RUN chmod 755 /startup.sh WORKDIR / ENTRYPOINT ["/startup.sh"] 

当主进程退出时,容器退出。 所以检查/startup.sh没有结束。

特别检查一下这个java

 java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml \ -Djava.security.egd=file:/dev/./urandom \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=8999 \ -Dcom.sun.management.jmxremote.local.only=false \ -Dcom.sun.management.jmxremote.rmi.port=8999 \ app.jar 

我认为这里的麻烦是当你指定像/app.jar这样的path时,确定current working directory实际位置是非常困难的。

它可以是任何地方,我怀疑Docker必须不小心将你的start.sh复制到某个地方。

您可能需要ssh进入容器,并执行find来查找startup.sh位置。

  1. docker ps -a – 查找docker工人的容器ID
  2. docker -i -t [CONTAINER_ID] /bin/bash – SSH里面
  3. find . -name "startup.sh" find . -name "startup.sh" – 查找文件。

如果你打算通过使用./ (当前工作目录)复制文件,我认为最好是指定current位置。 你可以使用WORKDIR关键字来做到这一点。

例如: WORKDIR /path/to/workdir

WORKDIR指令为Dockerfile中后面的 RUNCMDENTRYPOINTCOPYADD指令设置工作目录。 如果WORKDIR不存在,即使它不在任何后续的Dockerfile指令中使用,它也将被创build。

这样,docker不会感到困惑。

请参阅: https : //docs.docker.com/engine/reference/builder/#/workdir