我有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机器上运行容器。
答案 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
所在的位置。
docker ps -a
- 查找泊坞窗容器ID docker -i -t [CONTAINER_ID] /bin/bash
- SSH里面find . -name "startup.sh"
- 寻找文件。如果您打算使用./
(当前工作目录)复制文件,我认为最好指定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
。