谁知道官方Docker映像是否基于X

时间:2018-12-14 15:05:43

标签: docker docker-image

我想使用official image部署PHP容器。

此后,我需要安装imagick,因此也需要先使用libmagickwand-dev安装apt-get

AFAIK,PHP图片可以基于另一张图片,因此我需要将其设为基于Ubuntu的用户可以使用apt-get

如果我的主机有apt-get,我知道它将可用,但是如果我在用于MacOS的Docker 上运行此映像,

如何确定官方图片是否基于我所需的其他图片?

我想感谢与我所公开内容有关的任何其他评论,以便使我清楚或指出一个错误。

我的dockerfile看起来像:

# Backend Image - https://hub.docker.com/_/php/
FROM php:7.2-apache

# Imagick
RUN apt-get update && apt-get install -y libmagickwand-dev
RUN pecl install imagick-3.4.3 \
    && docker-php-ext-enable imagick

1 个答案:

答案 0 :(得分:1)

这是一个好的开始。让我一个接一个地解决您的问题,然后我会提供一些建议。

  

AFAIK,PHP图像可以基于另一个图像,而我需要它例如基于Ubuntu的用户可以使用apt-get。

正式的PHP映像是根据各种基本发行版构建的(https://hub.docker.com/_/php/列出了它们)。从那里我可以看到7.2-apache可能是基于debian Stretch的-这将是一个不错的选择。您可以看到这些映像是如何从其Dockerfiles构建的,该文件在该部分中也链接到github。

  

如果我的主机具有apt-get,我知道它将可用,但是如果我在Docker for MacOS上运行此映像,则可能没有它。

需要明确的是,泊坞窗的最大好处是,只要主机具有泊坞窗,主机运行的操作系统都无关紧要。映像中可用的组件仅由其所基于的映像和构建该映像的dockerfile定义-换句话说,如果您将dockerfile基于某些发行版-例如debian-stretch-包含apt,那么您将具有该版本及其附带的所有功能,无论您构建映像或运行该映像的任何位置。 OSX,Windows,Debian,Ubuntu,CoreOS,Centos-无关紧要。这是docker庞大的一个重要原因-处理将代码库与操作系统绑定的依赖项实际上是一个挑战,而docker使其完全消失了。

实际上,OSX不具有对本机docker所需的内核支持,并且无论如何都无法在本地运行linux ELF可执行文件,因此Docker for Mac使用osx本地虚拟化来创建几乎不可见的linux实例和{{1 }}在osx端的可执行文件负责代理到linux层。但这对用户是透明的。

  

如何确定官方图片是否基于我需要的其他图片?

通过查看dockerhub库页面中链接的docker文件。在您的情况下,这是https://github.com/docker-library/php/blob/master/7.2/stretch/apache/Dockerfile,它显示了它基于Stretch-slim /。 Debian Stretch-Slim非常适合Docker,因为它重量轻,并且不包含与Docker容器无关的一堆东西。

因此,您所做的一切看起来不错,而且入门也相当不错。

我确实想提到一件事,您可能想考虑一下。 apt的工作方式是,当您docker时,它将在本地下载很多程序包元数据。除非您在创建它的同一RUN命令中将其删除 ,否则这些索引文件将位于该RUN命令创建的层中;即使您在后续图层中将其删除,它们所占据的空间仍将是图像的一部分。

因此,当您这样做时:

apt-get update

您最终得到的图像比实际需要的要大。这就是为什么RUN apt-get update && apt-get install -y libmagickwand-dev RUN pecl install imagick-3.4.3 \ && docker-php-ext-enable imagick 对docker的规范调用通常看起来更像the upstream image you're using中的原因:

apt

RUN apt-get update && apt-get install -y \ $PHPIZE_DEPS \ ca-certificates \ curl \ xz-utils \ --no-install-recommends && rm -r /var/lib/apt/lists/* 会在不再需要包元数据时*在创建它的同一RUN命令中将其删除*,因此在运行时它不会随映像一起提供。这就是为什么您必须再次&& rm -r /var/lib/apt/lists/*。当然,您已经知道,无论如何都必须这样做才能获取最新的软件包存储库索引。因此,简而言之,在上述apt-get update行的末尾添加&& rm ...是一种很好的做法,并且可以与您现在拥有的所有内容一起使用。