未找到Docker镜像入口点脚本

时间:2016-07-21 04:17:50

标签: docker

我有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 run运行时,我得到了docker: Error response from daemon: Container command '/startup.sh' not found or does not exist..。 shell脚本具有执行权限。

我使用相同的方式运行我的其他应用程序,他们一切正常。我在Mac上编写了文件并试图在Linux机器上运行容器。

5 个答案:

答案 0 :(得分:2)

事实证明是^M DOS风格的行结尾字符导致了这个问题。但是因为我在Mac上编辑并且我用vim多次检查过,所以我很确定本地机器中的起始脚本没有那个字符。但是当在容器内打开vim时,我可以看到^M到处都是。所以,当复制到图像时,char会被添加到startup.sh,这很奇怪。这可以防止调用脚本。

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

答案 1 :(得分:1)

  

shell脚本具有执行权限。

你确定吗? (我的意思是容器中,onced ADDed)
可以肯定的是,我会使用Dockerfile:

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

答案 2 :(得分:1)

当主进程退出时,容器退出。因此,请检查/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

答案 3 :(得分:0)

我认为这里的问题是当您指定/app.jar之类的路径时,很难确定current working directory实际上的位置。

它可以是任何地方,我怀疑Docker必须意外地将您的start.sh复制到某个地点./

您可能希望ssh到容器中并执行find搜索并查看startup.sh所在的位置。

  1. docker ps -a - 查找泊坞窗容器ID
  2. docker -i -t [CONTAINER_ID] /bin/bash - SSH里面
  3. find . -name "startup.sh" - 寻找文件。
  4. 如果您打算使用./(当前工作目录)复制文件,我认为最好指定current的位置。您可以使用WORKDIR关键字执行此操作。

    实施例: WORKDIR /path/to/workdir

      

    WORKDIR 指令设置任何 RUN CMD 的工作目录,    ENTRYPOINT COPY ADD 指示   Dockerfile。如果WORKDIR不存在,即使是,也会创建它   它不会在任何后续的Dockerfile指令中使用。

    这样docker就不会感到困惑。

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

答案 4 :(得分:0)

我遇到了类似的问题,导致我找到了这个线程,但是我的问题与您的问题并不完全相同。对我来说,问题是我使用的是 alpine 基础映像,而我的脚本引用了 #!/bin/bash,我只需要在脚本顶部将我的更新为 #!/bin/sh