Dockerfile RUN命令的兼容性跨操作系统(apt-get)

时间:2016-04-06 08:15:32

标签: docker dockerfile

初学者的问题;在使用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版本。

2 个答案:

答案 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。