为什么 docker 报告“no such file or directory”: unknown?

Why does docker report "no such file or directory": unknown?

提问人:user2315104 提问时间:10/29/2018 最后编辑:Willi Mentzeluser2315104 更新时间:7/15/2021 访问量:24700

问:

预期内容

docker 应该构建映像并从中运行容器

Docker文件

FROM centos:7

ENV JAVA_VERSION 8u191
ENV BUILD_VERSION b12

RUN yum -y install wget; wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/$JAVA_VERSION-$BUILD_VERSION/2787e4a523244c269598db4e85c51e0c/jdk-$JAVA_VERSION-linux-x64.rpm" -O /tmp/jdk-8-linux-x64.rpm; yum -y install /tmp/jdk-8-linux-x64.rpm

# JDK stripping
RUN rm -f /usr/java/jdk1.8.0_77/src.zip /usr/java/jdk1.8.0_77/javafx-src.zip
RUN rm -rf /usr/java/jdk1.8.0_77/lib/missioncontrol/ /usr/java/jdk1.8.0_77/lib/visualvm/ /usr/java/jdk1.8.0_77/db/

RUN alternatives --install /usr/bin/java java /usr/java/latest/bin/java 1
RUN alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 1

ENV JAVA_HOME /usr/java/latest
ENV PATH=$PATH:/usr/java/latest/bin/java
RUN echo "$PATH"

RUN rm -f /tmp/jdk-8-linux-x64.rpm; yum -y remove wget; yum -y clean all

COPY target/gs-handling-form-submission-0.1.0.jar /tmp/gs-handling-form-submission-0.1.0.jar

CMD [ "java -jar /tmp/gs-handling-form-submission-0.1.0.jar" ]

build-context 是 Dockerfile 所在的当前目录。以下是目录结构

total 8
-rw-r--r--. 1 root     root     1079 Oct 29 03:42 Dockerfile
-rw-rw-r--. 1 ec2-user ec2-user 1917 Oct 27 09:17 pom.xml
drwxrwxr-x. 4 ec2-user ec2-user   30 Oct 27 10:15 src
drwxr-xr-x. 9 root     root      261 Oct 27 10:19 target

我正在执行以下命令来构建映像:

docker build --no-cache -f Dockerfile -t cpa:latest .

但是在运行容器时,收到以下消息

docker run -d -p 8081:8081/tcp cpa   
b2ba9831f1b74c73669843658727ca0d64fcd9de915739b96e17dcfd6e63c7db
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"java -jar /tmp/gs-handling-form-submission-0.1.0.jar\": stat java -jar /tmp/gs-handling-form-submission-0.1.0.jar: no such file or directory": unknown.

我不确定为什么构建的 jar 在容器文件系统的 /tmp 目录中不可用 在 docker 文档中,是用于将文件从主机复制到容器文件系统的正确关键字...... 但是问题出在哪里..? 请提出建议COPY

编辑 1 :将类型错误从 77 修复为 191 这是最新的 Dockerfile....

FROM centos:7

ENV JAVA_VERSION 8u191
ENV BUILD_VERSION b12

RUN yum -y install wget; wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/$JAVA_VERSION-$BUILD_VERSION/2787e4a523244c269598db4e85c51e0c/jdk-$JAVA_VERSION-linux-x64.rpm" -O /tmp/jdk-8-linux-x64.rpm; yum -y install /tmp/jdk-8-linux-x64.rpm

# JDK stripping
RUN rm -f /usr/java/jdk1.8.0_191/src.zip /usr/java/jdk1.8.0_191/javafx-src.zip
RUN rm -rf /usr/java/jdk1.8.0_191/lib/missioncontrol/ /usr/java/jdk1.8.0_191/lib/visualvm/ /usr/java/jdk1.8.0_191/db/

RUN alternatives --install /usr/bin/java java /usr/java/latest/bin/java 1
RUN alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 1

ENV JAVA_HOME /usr/java/latest
ENV PATH=$PATH:/usr/java/latest/bin/java
RUN echo "$PATH"

RUN rm -f /tmp/jdk-8-linux-x64.rpm; yum -y remove wget; yum -y clean all

COPY target/gs-handling-form-submission-0.1.0.jar /tmp/gs-handling-form-submission-0.1.0.jar

CMD [ "java -jar /tmp/gs-handling-form-submission-0.1.0.jar" ]

此外,dir 是生成上下文的一部分 请参考以下内容:target

[root@ip-172-31-14-242 cpa_final]# pwd
/tmp/cpa_final
[root@ip-172-31-14-242 cpa_final]# ll
total 8
-rw-r--r--. 1 root     root     1084 Oct 29 05:16 Dockerfile
-rw-rw-r--. 1 ec2-user ec2-user 1917 Oct 27 09:17 pom.xml
drwxrwxr-x. 4 ec2-user ec2-user   30 Oct 27 10:15 src
drwxr-xr-x. 9 root     root      261 Oct 27 10:19 target
[root@ip-172-31-14-242 cpa_final]# cd target/
[root@ip-172-31-14-242 target]# ll
total 17304
drwxr-xr-x. 4 root root       36 Oct 27 10:18 classes
drwxr-xr-x. 3 root root       25 Oct 27 10:18 generated-sources
drwxr-xr-x. 3 root root       30 Oct 27 10:18 generated-test-sources
-rw-r--r--. 1 root root 17708542 Oct 27 10:19 gs-handling-form-submission-0.1.0.jar
-rw-r--r--. 1 root root     4858 Oct 27 10:18 gs-handling-form-submission-0.1.0.jar.original
drwxr-xr-x. 2 root root       28 Oct 27 10:18 maven-archiver
drwxr-xr-x. 3 root root       35 Oct 27 10:18 maven-status
drwxr-xr-x. 2 root root      121 Oct 27 10:18 surefire-reports
drwxr-xr-x. 3 root root       19 Oct 27 10:18 test-classes
[root@ip-172-31-14-242 target]#

编辑2:

上面提到的 jar 文件位于容器文件系统的目录中。公安局/tmp

[root@ip-172-31-14-242 ~]# docker run -it cpa /bin/bash
[root@4018a6c2df8e /]# cd /tmp
[root@4018a6c2df8e tmp]# ll
total 17300
-rw-r--r--. 1 root root 17708542 Oct 27 10:19 gs-handling-form-submission-0.1.0.jar
-rwx------. 1 root root      836 Oct  6 19:15 ks-script-7RxiSx
-rw-------. 1 root root        0 Oct  6 19:14 yum.log
[root@4018a6c2df8e tmp]#
Java 码头工人

评论


答:

12赞 kutschkem 10/29/2018 #1
ENV PATH=$PATH:/usr/java/latest/bin/java

应该应该是

ENV PATH=$PATH:/usr/java/latest/bin

我假设没有找到的是 java 可执行文件。请检查 java 是否真的在 PATH 上。

同样错误的是这一行:

CMD [ "java -jar /tmp/gs-handling-form-submission-0.1.0.jar" ]

这应该为:

CMD [ "java", "-jar", "/tmp/gs-handling-form-submission-0.1.0.jar" ]

现在它正在寻找一个名为 “java -jar /tmp/gs-handling-form-submission-0.1.0.jar”并尝试执行它。

2赞 sandy.sm 5/28/2021 #2

对我来说,下面的变化正在改变

CMD ["java -jar myjar.jar"]

CMD java -jar myjar.jar

尝试删除方括号和双引号

评论

0赞 vatbub 11/24/2021
这似乎也适用于 ENTRYPOINT
8赞 Csongor Halmai 7/15/2021 #3

CMD 命令有三种形式。他们每个人都可以为您完成这项工作。

  • CMD ["param1","param2"]: “参数”形式
  • CMD ["executable","param1","param2"]: “exec” 表单
  • CMD command param1 param2: “”形式

前两个看起来是一样的,但它们的含义取决于中是否有。ENTRYPOINTDockerfile

  1. 当您的 .在本例中,CMD 命令中的字符串是 中定义的可执行文件的参数。就您而言:ENTRYPOINTDockerfileENTRYPOINT

    ENTRYPOINT ["/<path-to-your-java-binary>/java"]
    CMD ["-jar", "myjar.jar"]
    

    铌。中列出的参数必须是不同的字符串。 表示将两个参数传递给命令,而表示只有一个参数。CMDCMD ["a", "b"]CMD ["a b"]

  2. 如果 中没有 exec 形式,则使用 exec 形式。在本例中,第一个字符串是命令,后续字符串是各个参数。就您而言:ENTRYPOINTDockerfile

    CMD ["/<path-to-your-java-binary>/java", "-jar", "myjar.jar"]
    

    请注意,在 exec 形式中没有 shell 处理,即。未定义 shell 变量。

  3. 但是,在 shell 形式中,您可以访问 shell 变量,第一个参数 () 将由 shell 使用给定参数执行。就您而言:command/bin/sh

    CMD /<path-to-your-java-binary>/java -jar myjar.jar
    

要点:在这种情况下,最简单的就是最好的。