在 dockerfile 中如何使用 OS 特定命令
In dockerfile how can I use OS specific commands
Link: https://docs.docker.com/linux/step_four/
创建我们自己的镜像时,第9步有Dockerfile的内容,
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
但是 apt-get
是一个 OS 特定命令,不是吗?
我如何假设容器(linux 的精简版)将执行 apt-get?
您可以使用哪些命令(在本例中为包管理器)取决于"base"图像用于图像。
在这种情况下,docker/whalesay 图像基于 Ubuntu 14.04。可以在 Docker Hub 上看到用于构建此映像的 Docker 文件; https://hub.docker.com/r/docker/whalesay/
FROM ubuntu:14.04
# install cowsay, and move the "default.cow" out of the way so we can overwrite it with "docker.cow"
RUN apt-get update && apt-get install -y cowsay --no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& mv /usr/share/cowsay/cows/default.cow /usr/share/cowsay/cows/orig-default.cow
# "cowsay" installs to /usr/games
ENV PATH $PATH:/usr/games
COPY docker.cow /usr/share/cowsay/cows/
RUN ln -sv /usr/share/cowsay/cows/docker.cow /usr/share/cowsay/cows/default.cow
CMD ["cowboy"]
Ubuntu 和 Debian 是作为基础映像的热门选择,大多数官方映像都是基于 Debian 的,但您也可以找到基于 CentOS 等的映像; https://hub.docker.com/r/centos/mariadb/
最小发行版
基于Ubuntu和CentOS的镜像比较大。大多数时候,这不是问题,因为层可以在图像之间共享,因此所有基于相同版本(例如)Ubuntu 的图像都不需要再次下载这些层。
Docker 图片一般用于单个服务,Linux 的很多部分根本不需要,为什么要包含它们呢?因此,您会看到越来越多基于 最小 分布的图像,例如 Alpine.
例如,the official Redis image 现在也可用于 Alpine 变体。它仍然是相同的 Redis,具有相同的功能,但与 Debian-based 版本相比,大小差异巨大;
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 3-alpine 56ddc4d21480 6 days ago 15.95 MB
redis 3 d4deec2c521c 12 days ago 151.3 MB
Binary-only 图片
有些图像甚至根本不需要 Linux 基础;如果二进制文件是静态编译的,则可以创建一个包含 仅包含二进制文件本身 的图像。例如,Hello World 图像仅包含一个二进制文件,该图像的总大小为 960 字节。
Link: https://docs.docker.com/linux/step_four/
创建我们自己的镜像时,第9步有Dockerfile的内容,
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
但是 apt-get
是一个 OS 特定命令,不是吗?
我如何假设容器(linux 的精简版)将执行 apt-get?
您可以使用哪些命令(在本例中为包管理器)取决于"base"图像用于图像。
在这种情况下,docker/whalesay 图像基于 Ubuntu 14.04。可以在 Docker Hub 上看到用于构建此映像的 Docker 文件; https://hub.docker.com/r/docker/whalesay/
FROM ubuntu:14.04
# install cowsay, and move the "default.cow" out of the way so we can overwrite it with "docker.cow"
RUN apt-get update && apt-get install -y cowsay --no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& mv /usr/share/cowsay/cows/default.cow /usr/share/cowsay/cows/orig-default.cow
# "cowsay" installs to /usr/games
ENV PATH $PATH:/usr/games
COPY docker.cow /usr/share/cowsay/cows/
RUN ln -sv /usr/share/cowsay/cows/docker.cow /usr/share/cowsay/cows/default.cow
CMD ["cowboy"]
Ubuntu 和 Debian 是作为基础映像的热门选择,大多数官方映像都是基于 Debian 的,但您也可以找到基于 CentOS 等的映像; https://hub.docker.com/r/centos/mariadb/
最小发行版
基于Ubuntu和CentOS的镜像比较大。大多数时候,这不是问题,因为层可以在图像之间共享,因此所有基于相同版本(例如)Ubuntu 的图像都不需要再次下载这些层。
Docker 图片一般用于单个服务,Linux 的很多部分根本不需要,为什么要包含它们呢?因此,您会看到越来越多基于 最小 分布的图像,例如 Alpine.
例如,the official Redis image 现在也可用于 Alpine 变体。它仍然是相同的 Redis,具有相同的功能,但与 Debian-based 版本相比,大小差异巨大;
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 3-alpine 56ddc4d21480 6 days ago 15.95 MB
redis 3 d4deec2c521c 12 days ago 151.3 MB
Binary-only 图片
有些图像甚至根本不需要 Linux 基础;如果二进制文件是静态编译的,则可以创建一个包含 仅包含二进制文件本身 的图像。例如,Hello World 图像仅包含一个二进制文件,该图像的总大小为 960 字节。