Dockerfile RUN命令的兼容性跨OS(apt-get)

初学者的问题; 当使用RUN命令时,Docker如何处理底层操作系统的变化?

例如,让我们来看一个非常简单的官方Docker Hub Dockerfile,用于JRE 1.8 。 在安装java包时,Dockerfile使用apt-get

 RUN apt-get update && apt-get install -y --no-install-recommends ... 

对于未经训练的人来说,这似乎是一个特定于平台的指令,只能在基于Debian的操作系统(或者至less安装了APT的操作系统)上运行。

如何在CentOS上安装,例如,包pipe理器是yum ? 或者上帝保佑,像Solaris一样。


如果这种使用RUN来分叉任意shell命令的模式在docker中很stream行,那么如何避免跨平台甚至跨版本的依赖?

也就是说,如果Dockerfile编写器比我更新(比如说) grep会怎么样,他们已经使用了一些新的CLI标志,而这些标志在早期版本中是不可用的?

唯一的两个结果是:(1)RUN命令以非零退出码退出(2)Dockerfile在运行命令之前更改grep的安装版本。

所有Dockerfiles共享的共同点是FROM语句。 它是文件中的第一行,并指出您正在构build的父Docker映像。 一个典型的基本映像可以是一个与Ubuntu(即: https : //hub.docker.com/_/ubuntu/ )。 你在问题中分享的片段适合Ubuntu镜像(使用apt-get),但不能使用CentOS镜像。

总而言之,你要在你的CentOS系统中安装Docker,但是你正在用Ubuntu构build一个Docker镜像。

正如我在你的问题中所评论的,你可以添加FROM语句来指定你想要的中继操作系统。 例如:

 FROM docker.io/centos:latest RUN yum update -y RUN yum install -y java ... 

现在你必须build立/创build图像:

 docker build -t <image-name> . 

这个想法是,您将使用您熟悉的操作系统(例如,CentOS)并构build它的图像。 现在,你可以把这个镜像运行在Ubuntu / CentOS / RHEL上面,不pipe…什么的

 docker run -it <image-name> bash 

(您只需要在所需的操作系统中安装docker。