我想使用官方镜像部署一个PHP容器。
之后,我需要安装imagick
,所以我需要先使用apt-get
安装libmagickwand-dev
。
AFAIK,PHP
图像可以基于另一个图像,我需要它例如基于Ubuntu才能使用apt-get
。
如果我的主机有apt-get
,我知道它会可用,但如果我在Docker for MacOS上运行此映像,我可能没有它。
我如何知道官方形象是否基于我需要的另一个形象,比如这个案例
我要感谢与我所揭露的内容有关的任何其他评论,以便向我表明或指出错误。
我的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
这是一个良好的开端。让我逐一谈谈你的顾虑,然后我会提供一些建议。
AFAIK,PHP图像可以基于另一个图像,我需要它是例如基于Ubuntu的,才能使用apt-get。
官方PHP映像是从各种基本发行版构建的(https://hub.docker.com/_/php/列出它们(。从那里我可以看出,7.2-apache
可能是基于debian stretch的,这是一个很好的选择,可以提供apt。你可以看到这些图像是如何从它们的Dockerfiles构建的,它们在该部分也链接到github。
如果我的主机有apt-get,我知道它会可用,但如果我在Docker for MacOS上运行此映像,我可能没有它。
需要明确的是,docker的最大好处是主机运行的操作系统无关紧要,只要它有docker。映像中可用的组件仅由它所基于的映像和构建它的dockerfile定义——换句话说,如果你的Dockerfle基于一些包括apt的分发版,比如debian stretch,那么无论你在哪里构建或运行映像,你都会有那个版本和它附带的一切。OSX、Windows、debian、Ubuntu、CoreOS,Centos——没关系。这就是docker庞大的一个重要原因——处理将代码库与操作系统联系起来的依赖关系实际上是一个相当大的挑战,而docker让它彻底消失了。
事实上,OSX没有对原生docker所需的内核支持,也无法在本地运行linux ELF可执行文件,因此docker for Mac使用OSX原生虚拟化来创建一个几乎不可见的linux实例,而OSX端的docker
可执行文件负责代理到linux层。但这对用户来说是透明的。
我如何知道官方图片是否基于我需要的另一个图片,比如这个案例?
通过查看dockerhub库页面中链接到的docker文件。在你的情况下https://github.com/docker-library/php/blob/master/7.2/stretch/apache/Dockerfile这表明其基于拉伸纤薄/。Debian stretch slim非常适合docker,因为它重量轻,不包括一堆与docker容器无关的东西。
所以,你所做的看起来很好,而且你开始得很好。
我确实想提一件你可能想考虑的事。apt的工作方式是,当您apt-get update
时,它会在本地下载大量包元数据。除非您在创建它的同一RUN命令中删除它,否则这些索引文件将位于该RUN命令创建的层中;即使在后续图层中删除它们,它们所占的空间仍然是图像的一部分。
所以当你这样做的时候:
RUN apt-get update && apt-get install -y libmagickwand-dev
RUN pecl install imagick-3.4.3
&& docker-php-ext-enable imagick
你最终得到的图像比它需要的要大。这就是为什么docker对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/*
CCD_ 11在创建包元数据的同一RUN命令中删除包元数据。这就是为什么你必须再次apt-get update
。当然,您已经意识到,为了获得最新的包存储库索引,无论如何都必须这样做。简而言之,在上面的apt
行的末尾添加&& rm ...
是一种很好的做法,并且可以使用您现在的内容。