在构建Docker镜像时,操作系统的更新需要永远

时间:2017-08-30 21:15:09

标签: docker

我使用Debian:最新作为Docker容器的基本映像。

问题是,在每次构建时,我都必须更新操作系统软件包,这需要永远。这是我的工作:

FROM debian:latest

RUN apt-get update && apt-get install -y --force-yes --no-install-recommends nginx

...

apt-get update && apt-get install永远持续下去。我该怎么办?

2 个答案:

答案 0 :(得分:3)

Docker镜像很少,只包括运行该基本图像的绝对必需品。对于Debian基础映像,这意味着没有包repo缓存。因此,当您运行DECLARE @t TABLE(Dept varchar(4)) DECLARE @CurrentUserDept varchar(4) = (SELECT EmployeePracticeArea FROM dimEmployee WHERE UserLogin = @CurrentUser) IF @CurrentUserDept = 'CS' BEGIN INSERT INTO @t VALUES ('EUR'), ('LIFA'), ('REM') END ELSE BEGIN INSERT INTO @t SELECT @CurrentUserDept END SELECT * FROM @t 时,它将首次从所有存储库下载软件包存储库缓存。如果它们包含了软件包repo缓存,那么很多软件包状态就会很快过时,从而导致更大的基础映像,而以后几乎不做更新。

实际的debian:最新图片相对较好地保留了上个月的提交。您可以在此处查看各种代码:https://hub.docker.com/_/debian/

为缩短图像构建时间,建议您不要每次都删除图像。相反,请执行新的构建和标记,并在构建新映像后,运行apt-get update以从先前构建中删除未标记的图像。这允许docker重用先前图像构建中的缓存。

或者,您可以创建自己更新的基础映像,并且具有所有应用程序先决条件。像任何其他图像一样构建它,然后将docker image prune --force更改为FROM debian:latest

最后一个提示,请避免在您的图片构建中使用FROM your_base_image,而是执行类似latest的操作,以便debian中的主要版本更新不会破坏您的构建。

答案 1 :(得分:1)

不要删除每个版本上的图像。只需修改您的Dockerfile并再次构建。 Docker是“聪明的”,它将保持未修改的层仅从您更改的行构建。用于此目的的中间图像(docker正在自动创建它们)可以使用以下命令轻松删除:

docker rmi $(docker images -q -f dangling=true)

你可以节省很多时间。记住,不要删除图像。只需修改Dockerfile并重新构建即可。完成所有工作后,这个命令就完成了,这就是你所需要的。

另一个“推出清洁命令的好处”可以是:

docker volume prune -f

但是这最后一个命令是用于与图像无关的其他类型的清理......更侧重于容器。