Docker从Dockerfile镜像错误运行容器

时间:2018-06-24 18:03:14

标签: dockerfile

尝试运行时出现以下错误:

$ 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!

1 个答案:

答案 0 :(得分:1)

documentationCMD

  

CMD指令具有三种形式:

     
      
  1. CMD [“ executable”,“ param1”,“ param2”](执行格式,这是首选   表单)
  2.   
  3. CMD [“ param1”,“ param2”](作为ENTRYPOINT的默认参数)
  4.   
  5. CMD命令param1 param2(shell形式)
  6.   

并且:

  

注意:与shell表单不同,exec表单不会调用命令   贝壳。这意味着正常的外壳处理不会发生。

也:

  

如果要在没有外壳的情况下运行<command>,则必须   将命令表示为JSON数组,并给出该命令的完整路径   可执行文件。(重点是我的)

因此,您有几个问题:

  1. 您正在使用Exec表单(因为它包含在方括号中),但尚未指定Java可执行文件的完整路径。
  2. 您尚未将参数作为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

这两个都应该起作用。