java - 在 docker 上运行 java 代码

标签 java unix docker dockerfile

我尝试在 docker 上运行 java 代码,但出现无法解决的错误,您能帮帮我吗?!

我有一个非常简单的 java 代码来计算平均值。

import java.util.Scanner;

class Ave
{
     public static void main(String args[])

     {

          int n;
          double res=0;

      Scanner reader=new Scanner(System.in);

      System.out.println("Enter how many numbers to calculate the avrage ");

          n=reader.nextInt();

      int a[]=new int[n];

      System.out.println("Enter   "+n+"  numbers");

          for(int i=0;i<n;i++)
           a[i]= (int) reader.nextDouble(); 

      res=Ave.CalAvg(a,n); 

      System.out.println("The average is " +res/n);

     }

       static double CalAvg(int  a[],int n)
       {
       double res=0;

       for(int i=0;i<n;i++)
           res =res+a[i];

       return res;
        }
}

我的 Dockerfile 是

FROM alpine:latest
ADD Ave.class Ave.class
RUN apk --update add openjdk8-jre
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "Ave"]

我使用 Java 编译器编译了这个文件。

$ javac Ave.java

我使用下面的命令从这个 Dockerfile 构建一个镜像

$ docker build --tag "docker-hello-world:latest" .

然后,我尝试通过执行以下命令来运行 Docker 镜像以查看结果。

$ docker run docker-hello-world:latest

最后,我得到了这个我无法弄清楚的错误或异常

代码在服务器和本地机器上运行,但在 docker 上不起作用

Enter how many numbers to calculate the avrage 
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at Ave.main(Ave.java:17)

The result

最佳答案

尝试跟随

我的环境:Mac-Os Sierra-10.12.6

Docker 版本:

Docker version 18.03.0-ce, build 0520e24

检查容器中的 Java 版本:

  1. 执行 $docker run -it docker-hello-world:latest

  2. 通过执行 $docker ps 获取 ContainerID

  3. 获取 docker 镜像的 shell docker exec -i -t <CONTAINER ID>

  4. 执行以下命令

    $java -version

openjdk version "1.8.0_151"

OpenJDK Runtime Environment (IcedTea 3.6.0) (Alpine 8.151.12-r0)

OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

创建一个目录(我在这里给的任何名称 a ),我在桌面创建,

cd ~/Desktop
mkdir a

创建 Ave.java文件在 ~/Desktop/a目录

此外,在同一目录中有 Dockerfile(/a)

考虑到Ave.java中没有包名

$javac Ave.java

现在 文件夹/a 将有 3 个文件,Ave.java、Ave.class、Dockerfile

执行以下命令

$docker build -t docker-hello-world:latest .

控制台日志:

Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM alpine:latest
 ---> 3fd9065eaf02
Step 2/4 : ADD Ave.class Ave.class
 ---> 8b94ae6de674
Step 3/4 : RUN apk --update add openjdk8-jre
 ---> Running in f12eb4589a34
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/39) Installing libffi (3.2.1-r4)
(2/39) Installing libtasn1 (4.12-r3)
(3/39) Installing p11-kit (0.23.2-r2)
(4/39) Installing p11-kit-trust (0.23.2-r2)
(5/39) Installing ca-certificates (20171114-r0)
(6/39) Installing java-cacerts (1.0-r0)
(7/39) Installing libxau (1.0.8-r2)
(8/39) Installing libbsd (0.8.6-r1)
(9/39) Installing libxdmcp (1.1.2-r4)
(10/39) Installing libxcb (1.12-r1)
(11/39) Installing libx11 (1.6.5-r1)
(12/39) Installing libxcomposite (0.4.4-r1)
(13/39) Installing libxext (1.3.3-r2)
(14/39) Installing libxi (1.7.9-r1)
(15/39) Installing libxrender (0.9.10-r2)
(16/39) Installing libxtst (1.2.3-r1)
(17/39) Installing alsa-lib (1.1.4.1-r2)
(18/39) Installing libbz2 (1.0.6-r6)
(19/39) Installing libpng (1.6.34-r1)
(20/39) Installing freetype (2.8.1-r2)
(21/39) Installing libgcc (6.4.0-r5)
(22/39) Installing giflib (5.1.4-r1)
(23/39) Installing libjpeg-turbo (1.5.2-r0)
(24/39) Installing libstdc++ (6.4.0-r5)
(25/39) Installing openjdk8-jre-lib (8.151.12-r0)
(26/39) Installing java-common (0.1-r0)
(27/39) Installing krb5-conf (1.0-r1)
(28/39) Installing libcom_err (1.43.7-r0)
(29/39) Installing keyutils-libs (1.5.10-r0)
(30/39) Installing libverto (0.3.0-r0)
(31/39) Installing krb5-libs (1.15.2-r1)
(32/39) Installing lcms2 (2.8-r1)
(33/39) Installing nspr (4.17-r0)
(34/39) Installing sqlite-libs (3.21.0-r0)
(35/39) Installing nss (3.34.1-r0)
(36/39) Installing pcsc-lite-libs (1.8.22-r0)
(37/39) Installing lksctp-tools (1.0.17-r0)
(38/39) Installing openjdk8-jre-base (8.151.12-r0)
(39/39) Installing openjdk8-jre (8.151.12-r0)
Executing busybox-1.27.2-r7.trigger
Executing ca-certificates-20171114-r0.trigger
Executing java-common-0.1-r0.trigger
OK: 81 MiB in 50 packages
Removing intermediate container f12eb4589a34
 ---> 82d9ecfcc95e
Step 4/4 : ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "Ave"]
 ---> Running in 28f2df6fb544
Removing intermediate container 28f2df6fb544
 ---> bbf098575e6a
Successfully built bbf098575e6a
Successfully tagged docker-hello-world:latest

按照@Siking的建议执行命令

$docker run -it docker-hello-world:latest

这是输出的快照: enter image description here

关于java - 在 docker 上运行 java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951042/

相关文章:

java - 在 Eclipse 中管理应用程序的 Lite 和 Pro 版本

java - JMeter - 我可以将 2 个用户变量合并为一个吗?

Java 正则表达式不区分大小写不起作用

linux - 如何删除X个字符后的所有单词

python - 如何在python中读取/dev/random

java - 将字符串(键)映射到 XML 架构(值)

linux - 需要帮助在 shell 中获得两个数字之间的差距

python - pycharm 无法完成 Docker 的远程解释器设置

spring-boot - 如何在Kubernetes集群中正确配置环境?

python - Nginx 后面的 Flask/Python 应用程序运行约 24 小时后出现 uWSGI 段错误