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

jwa*_*jwa 5 docker dockerfile

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

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

RUN apt-get update && apt-get install -y --no-install-recommends ...
Run Code Online (Sandbox Code Playgroud)

对于未经训练的人来说,这似乎是特定于平台的指令,仅适用于基于 Debian 的操作系统(或至少安装了 APT 的操作系统)。

这在 CentOS 安装上到底如何工作,例如,包管理器在哪里yum?或者上帝保佑,像Solaris这样的东西。


如果这种使用 fork 任意 shell 命令的模式RUN在 docker 中很普遍,那么如何避免平台间甚至版本间的依赖关系呢?

即,如果 Dockerfile 编写者拥有比我更新的版本grep,并且他们使用了一些早期版本中不可用的新 CLI 标志,该怎么办?

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

Ita*_*ayB 1

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

FROM docker.io/centos:latest
RUN yum update -y
RUN yum install -y java
...
Run Code Online (Sandbox Code Playgroud)

现在你必须使用以下命令构建/创建图像:

docker build -t <image-name> .
Run Code Online (Sandbox Code Playgroud)

这个想法是,您将使用您熟悉的操作系统(例如 CentOS)并构建它的映像。现在,您可以获取此映像并在 Ubuntu/CentOS/RHEL/无论什么...上运行它

docker run -it <image-name> bash
Run Code Online (Sandbox Code Playgroud)

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