我使用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
永远持续下去。我该怎么办?
答案 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
但是这最后一个命令是用于与图像无关的其他类型的清理......更侧重于容器。