创build一个简单的Java应用程序作为docker图像

我正在学习docker工具,并提到在线课程。 经过一些舒适的水平,我现在正在尝试制作一个dockerized java图像,一个简单的Java应用程序。

我正在尝试使dockerized Java应用程序没有任何最小的操作系统,因此在Dockerfile中使用FROM scratch 。 以下是内容:

 FROM scratch ADD FirstJavaApp.class . RUN yum -y install java CMD java FirstJavaApp 

据我所知,任何应用程序的dockerized图像应该有所有的依赖符合(并为此目的,我已经在Dockerfile中添加了yum -y install java )。

现在,当我使用这个Dockerfile构build图像时,它给了我下面的错误:

 sudo docker build -t javaappusingscratch . Sending build context to Docker daemon 377.8MB Step 1/4 : FROM scratch ---> Step 2/4 : ADD FirstJavaApp.class . ---> Using cache ---> c624d7dc7c21 Step 3/4 : RUN yum -y install java ---> Running in 702829f38ad8 container_linux.go:265: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory" oci runtime error: container_linux.go:265: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory" 

但是,如果我FROM scratch FROM centos FROM scratchreplace,它工作正常。 据我所知, scratch没有任何最小的操作系统,我的目标是build立只有应用程序及其依赖的图像,这就是docker图像的目标。

那么,有什么我失踪或理解不好? 任何人都可以帮我理解这个吗?

你不能使用CMD除非你有一个shell,而你scratch没有shell。 一般来说,你会发现Java依赖于一堆不scratch的东西。 你可以find比centos更薄的select(比如Alpine),但是它不会scratch工作。