![如何编写基于 Debian Slim 的 Dockerfile,使“apt-get update”不会因公钥错误而失败?](https://linux22.com/image/787690/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E5%9F%BA%E4%BA%8E%20Debian%20Slim%20%E7%9A%84%20Dockerfile%EF%BC%8C%E4%BD%BF%E2%80%9Capt-get%20update%E2%80%9D%E4%B8%8D%E4%BC%9A%E5%9B%A0%E5%85%AC%E9%92%A5%E9%94%99%E8%AF%AF%E8%80%8C%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
构建服务器是 Ubuntu 16.04,最近已修补sudo apt update && sudo apt upgrade
。
docker version
说:
Version: 18.06.0-ce
API version: 1.38
Go version: go1.10.3
Git commit: 0ffa825
Built: Wed Jul 18 19:11:02 2018
OS/Arch: linux/amd64
Experimental: false
Dockerfile 如下所示:
FROM debian:12-slim
RUN apt-get update \
&& apt-get install -y wget \
&& apt-get install -y supervisor \
&& apt-get install -y apt-utils \
&& apt-get install -y nginx \
&& apt-get install -y libgdiplus
RUN apt-get autoremove -y \
&& apt-get clean -y \
&& apt-get autoclean -y \
&& rm -rf /var/lib/apt/lists/*
# .. other stuff cut ..
该apt-get update
步骤失败并显示:
W: GPG error: http://deb.debian.org/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY F8D2585B8783D481
E: The repository 'http://deb.debian.org/debian bookworm InRelease' is not signed.
W: GPG error: http://deb.debian.org/debian bookworm-updates InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131
E: The repository 'http://deb.debian.org/debian bookworm-updates InRelease' is not signed.
W: GPG error: http://deb.debian.org/debian-security bookworm-security InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8
E: The repository 'http://deb.debian.org/debian-security bookworm-security InRelease' is not signed.
据推测我需要先做RUN
一些事情来更新公钥。
我可以找到很多指南来通过将丢失的键复制粘贴到命令行来手动解决这个问题,但显然我需要将修复作为 Dockerfile 的一部分(并且理想情况下,如果可能的话,如果键被更改,则不会失败?)。
apt-get
但也许官方基础镜像无法工作这一事实预示着更深层次的问题?
我是否为最小 Debian Docker 映像使用了正确的标签?
该问题是否与使用 Debian 的 slim 发行版有关?
这可能是构建环境或旧 Docker 版本的问题吗?
有什么想法吗?
(背景:目的是为旧版应用程序构建 .Net Core 2.1 运行时映像,但官方的 Microsoft 运行时映像不再受支持,并且最近出现了自己的问题,导致apt-get
出现许多 404 错误。这里选择 Debian slim 是因为该映像基于相同的旧版本。)
编辑:评论似乎表明问题可能出在环境上;当使用 Docker 24.0.4 在 Ubuntu 22.04.2 上构建相同的 Dockerfile 时,一切都很好。问题回答为:不要使用过时的构建服务器!
答案1
根本原因是 outdatedlibseccomp
阻止了 Debian Bookworm 使用的新 Linux 系统调用。有三种方法:
- 更新 Docker 和
libseccomp
- 使用较旧的图像,例如
debian:11-slim
- 在禁用安全性的情况下运行
--security-opt seccomp=unconfined
(显然是不安全的方法)