docker 运行java程序,DockerFile运行Java程序

Hi I'm new to Docker and trying out to write a new image from the scratch. I am writing this dockerFile to compile and run a simple java program available in the same directory.

Here is the dockerfile.

FROM scratch

CMD javac HelloWorld.java

CMD java HelloWorld

Docker build is successful as shown below

[root@hadoop01 myjavadir]# docker build -t runhelloworld .

Sending build context to Docker daemon 3.072 kB

Sending build context to Docker daemon

Step 0 : FROM scratch

--->

Step 1 : CMD javac HelloWorld.java

---> Running in 7298ad7e902f

---> f5278ae25f0c

Removing intermediate container 7298ad7e902f

Step 2 : CMD java HelloWorld

---> Running in 0fa2151dc7b0

---> 25453e89b3f0

Removing intermediate container 0fa2151dc7b0

Successfully built 25453e89b3f0

But when i try to run, it throws the following error:

[root@hadoop01 myjavadir]# docker run runhelloworld

exec: "/bin/sh": stat /bin/sh: no such file or directory

Error response from daemon: Cannot start container 676717677d3f1bf3b0b000d68b60c32826939b8c6ec1b5f2e9876969c60e22a4: [8] System error: exec: "/bin/sh": stat /bin/sh: no such file or directory

[root@hadoop01 myjavadir]# exec: "/bin/sh": stat /bin/sh: no such file or directory

bash: exec:: command not found

Please help to resolve the same.

Update after chaning second line to RUN.

[root@hadoop01 myjavadir]# docker build -t runhelloworld .

Sending build context to Docker daemon 3.584 kB

Sending build context to Docker daemon

Step 0 : FROM scratch

--->

Step 1 : RUN javac HelloWorld.java

---> Running in fdef2d65ac58

exec: "/bin/sh": stat /bin/sh: no such file or directory [8]

System error: exec: "/bin/sh": stat /bin/sh: no such file or directory

解决方案

Explanation

There can only be one CMD instruction in a Dockerfile. If you list

more than one CMD then only the last CMD will take effect.

That is why the javac command is not executed and starting your container results in no such file or directory was found.

CMD and ENTRYPOINT are used for the tasks that shall be started once you execute the container (entrypoint level).

The main purpose of a CMD is to provide defaults for an executing container.

That applies to the line CMD java HelloWorld, but not to CMD javac HelloWorld.java which is more of a build step. That is what RUN is for.

Solution

Change the second line to RUN javac HelloWorld.java.

FROM scratch

RUN javac HelloWorld.java

CMD java HelloWorld

The resulting committed image [from line two] will be used for

the next step in the Dockerfile.

Update

As Diyoda pointed out, make sure that the FROM image supplies java.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值