尝试运行时出现以下错误:
$ docker run my-app-11
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"java -jar /opt/my-app-1.0-SNAPSHOT.jar\": stat java -jar /opt/my-app-1.0-SNAPSHOT.jar: no such file or directory": unknown.
我用来创建映像的Dockerfile如下:
FROM anapsix/alpine-java
COPY target/my-app-1.0-SNAPSHOT.jar /opt/my-app-1.0-SNAPSHOT.jar
WORKDIR /opt
CMD ["java -jar /opt/my-app-1.0-SNAPSHOT.jar"]
当我进入容器并运行命令时,它运行良好:
$ docker run -it my-app-11 /bin/bash
bash-4.4# java -jar /opt/my-app-1.0-SNAPSHOT.jar
Hello World!
答案 0 :(得分:1)
从documentation到CMD
:
CMD指令具有三种形式:
- CMD [“ executable”,“ param1”,“ param2”](执行格式,这是首选 表单)
- CMD [“ param1”,“ param2”](作为ENTRYPOINT的默认参数)
- CMD命令param1 param2(shell形式)
并且:
注意:与shell表单不同,exec表单不会调用命令 贝壳。这意味着正常的外壳处理不会发生。
也:
如果要在没有外壳的情况下运行
<command>
,则必须 将命令表示为JSON数组,并给出该命令的完整路径 可执行文件。(重点是我的)
因此,您有几个问题:
进入容器时,您正在运行BASH Shell,因此路径中包含Java可执行文件,并且该命令运行。 CMD
作为exec
运行时不是这种情况,因此会失败。
我认为,如果将行更改为:
CMD ["/path/to/java", "-jar", "/opt/my-app-1.0-SNAPSHOT.jar"]
或
CMD java -jar /opt/my-app-1.0-SNAPSHOT.jar
这两个都应该起作用。