未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
位置。
-
docker ps -a
– 查找docker工人的容器ID -
docker -i -t [CONTAINER_ID] /bin/bash
– SSH里面 -
find . -name "startup.sh"
find . -name "startup.sh"
– 查找文件。
如果你打算通过使用./
(当前工作目录)复制文件,我认为最好是指定current
位置。 你可以使用WORKDIR
关键字来做到这一点。
例如: WORKDIR /path/to/workdir
WORKDIR指令为Dockerfile中后面的 RUN , CMD , ENTRYPOINT , COPY和ADD指令设置工作目录。 如果WORKDIR不存在,即使它不在任何后续的Dockerfile指令中使用,它也将被创build。
这样,docker不会感到困惑。
请参阅: https : //docs.docker.com/engine/reference/builder/#/workdir