初学者的问题;在使用RUN
命令时,Docker如何处理底层操作系统变体?
让我们来看一个非常简单的官方Docker Hub Docker文件,用于JRE 1.8。在安装java的包时,Dockerfile使用apt-get
:
RUN apt-get update && apt-get install -y --no-install-recommends ...
对于未经训练的人来说,这似乎是一个特定于平台的指令,只适用于基于Debian的操作系统(或者至少安装了APT的操作系统)。
如何在CentOS安装上运行,例如,包管理器是yum
?或者上帝保佑,比如Solaris。
如果使用RUN
分叉任意shell命令的这种模式在docker中很普遍,那么如何避免跨平台,甚至是版本间的依赖?
即。如果Dockerfile编写器比我更新版(例如)grep
,并且他们使用了一些在早期版本上不可用的新CLI标志,该怎么办?
唯一的两个结果可能是:(1)RUN命令以非零退出代码退出(2)Dockerfile在运行命令之前更改安装的grep版本。
答案 0 :(得分:1)
所有Dockerfiles共享的共同点是FROM
语句。它是文件中的第一行,表示您正在构建的父Docker镜像。典型的基本图像可以是Ubuntu(即https://hub.docker.com/_/ubuntu/)。您在问题中分享的片段非常适合Ubuntu图像(使用apt-get),但不适合CentOS图像。
总之,您在CentOS系统中安装了docker,但是您正在构建一个包含Ubuntu的Docker镜像。
答案 1 :(得分:0)
正如我在您的问题中所评论的那样,您可以添加FROM语句来指定您想要的中继操作系统。例如:
FROM docker.io/centos:latest
RUN yum update -y
RUN yum install -y java
...
现在您必须使用以下内容构建/创建图像:
docker build -t <image-name> .
您的想法是,您将使用您熟悉的操作系统(例如,CentOS)并构建它的图像。现在,你可以拍摄这张图片并在Ubuntu / CentOS / RHEL /上面运行它...
docker run -it <image-name> bash
(您只需要在所需的操作系统中安装docker。