【问题标题】:Unable to run java Program. Error inside docker无法运行 java 程序。码头工人内部的错误
【发布时间】:2017-11-11 10:22:20
【问题描述】:

我只是 Docker 的初学者,正在探索各种功能。我已经在docker里面成功安装了java

**OS version**:Windows Server 2016

PS C:\testing> docker version
Client:
 Version:      17.03.1-ee-3
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
Server:
   Version:      17.03.1-ee-3

 API version:  1.27 (minimum version 1.24)
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
 Experimental: false
PS C:\testing>

在路径C:\java-windows-docker\Dockerfile中创建了一个Dockerfile,并在里面放了以下几行:

 FROM windowsservercore  
  RUN powershell (new-object     
System.Net.WebClient).Downloadfile('http://javadl.oracle.com/webapps/download/AutoDL?
BundleId=210185', 'C:\jre-8u91-windows-x64.exe')
RUN powershell start-process -filepath C:\jre-8u91-windows-x64.exe -passthru -wait -argumentlist"/s,INSTALLDIR=c:\Java\jre1.8.0_91,/L,install64.log"
RUN del C:\jre-8u91-windows-x64.exe
CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]
It downloads the Java 8 Update 91 Windows installer and silently installs it to c:\Java\jre1.8.0_91.

docker build -t java-windows-docker C:\java-windows-docker 如果我们运行它,在启动之后,容器会启动 Java 并打印出它的版本。

PS C:\Windows\system32> docker run java-windows-docker
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
We have Java running. inside a Windows docker container which is hosted on a Windows server 2016

我想运行一个简单的 java 程序。 java文件中的代码如下:

    class Hello{  
public static void main(String[] args){  
System.out.println("This is java app \n by using Docker");  
} 
}

然后,作为下一步,我为上述程序构建了映像。 Dockerfile 用于构建java程序

FROM testing
WORKDIR C:\\testing
RUN javac Hello.java
CMD ["java","Hello"]

当我构建图像时,我收到以下错误:

PS C:\testing> docker build -t testing C:\testing 发送构建 Docker 守护进程的上下文 11.78 kB 步骤 1/5:FROM java-windows-docker ---> 534f46817a18 步骤 2/5:WORKDIR C:\testing ---> fc954983c8b0 删除中间容器 5e30071d9159 步骤 3/5:运行 javac Hello.java ---> 运行 c91c62ba707c javac' 未被识别为内部或外部 命令、可运行的程序或批处理文件。命令'cmd /S /C javac Hello.java' 返回一个非零代码:1

对此的任何建议都会有所帮助。如果可能的话,请帮助我使用示例 Dockerfile 来运行这个 java 程序。在过去的两天里,我一直在研究这个,但我无法让它工作。 我想知道如何在 docker 映像中设置路径以及它是如何工作的。我也尝试设置路径

ENV JAVA_HOME C:\Java\jre1.8.0_91\bin;
RUN setx PATH %PATH%;%JAVA_HOME%\bin
RUN setx CLASSPATH %CLASSPATH%;C:\Java\jre1.8.0_91;C:\testing;.;

但它不起作用。我不知道在构建 java 映像或运行 java 程序时何时设置此路径。请告知。提前谢谢

【问题讨论】:

  • Docker 镜像就像虚拟机一样冻结在时间里。让我们回顾一下: - windowsservercore >> java-windows-docker - 测试(来自哪个图像?本身?)我认为您应该从 java-windows-docker 创建测试图像。当您创建 java-windows-docker 时,您必须创建 JAVA_HOME,并将您的 java 安装添加到 PATH 环境变量。

标签: docker dockerfile docker-for-windows docker-desktop docker-java


【解决方案1】:

我的事情你没有在系统中设置环境变量。设置java路径为:

  1. 我的电脑 -> 系统属性 ->高级系统设置 ->点击环境变量。

  2. 单击新建: 输入变量名称为:JAVA_HOME 变量值为 :C:\Program Files\Java\jdk1.8.0_121\bin //你的 java bin 路径。

【讨论】:

    【解决方案2】:

    图像有层次。每一层由:图像库+命令组成。

    让我们回顾一下,你创建了 java-windows-docker:

     FROM windowsservercore  
     RUN powershell...
     RUN powershell...
     RUN del C:\jre-8u91-windows-x64.exe
     CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]
    

    您必须将此目录添加到 PATH 并定义您的 JAVA_HOME。

     FROM windowsservercore  
     RUN powershell...
     RUN powershell...
     RUN del C:\jre-8u91-windows-x64.exe
     RUN set JAVA_HOME=""c:\\Java\\jre1.8.0_91\\"
     RUN set PATH=%PATH%,%JAVA_HOME%\bin
     CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]
    

    因此,在此容器 (java-windows-docker) 上运行的每个应用程序都可以独立于目录访问 Java。

    然后您的测试镜像将使用 java-windows-docker 镜像作为镜像库:

    FROM java-windows-docker
    WORKDIR C:\\testing
    RUN javac Hello.java
    CMD ["java","Hello"]
    

    PS:我没有关注语法。只在概念上。我现在不在我的开发机器前。 ;)

    【讨论】:

    • 嗨安德森它仍然给我同样的错误 PS C:\Users\Administrator> docker build -t testing C:\testing 将构建上下文发送到 Docker 守护进程 3.072 kB 步骤 1/4:从最终 - --> 6dbb140824c1 步骤 2/4:WORKDIR C:\\testing ---> 使用缓存 ---> a6b874bdd543 步骤 3/4:运行 javac Hello.java ---> 在 a28e929b64f1 'javac' 中运行未被识别为内部或外部命令、可运行程序或批处理文件。命令“cmd /S /C javac Hello.java”返回一个非零代码:1 我错过了什么
    • 您好,创建每个容器后,将其执行并输入。 (docker exec -it container_name cmd/bash)。然后检查文件夹是否以及预期的命令是否正常运行。如果容器不是您想要的,您可以在容器内运行正确的命令来纠正它。然后使用 cmd+q+cmd+p 分离并使用 docker commit 创建新映像提交更改。您将能够使用 docker history image_name 查看命令历史记录,并将其与您的 Dockerfile 进行比较。
    • 这就像一个逆向工程。有时,我会观察一些大玩家构建的容器的 docker 历史,并将其作为构建自己的 Dockerfile 的指南。当您对所有命令或脚本不太熟悉时,这会很有帮助。这个过程可以帮助您实现目标。
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多