我正在尝试构建一个 Docker 映像(基于
debian:latest
)以进行交叉编译。此过程中的一个步骤是创建交叉编译 sysroot,其中涉及在运行的容器中运行以下命令:
mk-sbuild \
--name=rpi3b-bookworm \
--arch=arm64 \
--debootstrap-mirror="http://ftp.debian.org/debian" \
--skip-proposed --skip-updates --skip-security \
bookworm
但是,此命令仅在容器以
docker run --priviledged
启动时才有效(因为它需要 chroot
等等)。好像没办法把这个flag传递给docker build
。
运行
docker commit
后,除了 mk-sbuild
之外,我还有哪些选项可以保存图像?我听说不鼓励使用 docker commit
。有没有办法在 Dockerfile 中运行这个命令?
事实证明
debootstrap
是制作交叉编译sysroot更合适的工具。不同之处在于,如果无法在 chroot 内挂载 mk-sbuild
,/proc
将会失败,而 debootstrap
只是发出警告。
作为参考,这是我最终得到的完整 Dockerfile:
FROM mcr.microsoft.com/devcontainers/cpp:debian-12
ARG sysroot_path=/home/vscode/rpi3b-bookworm-arm64
# Make apt non-interactive (or else the build might hang)
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends \
file neovim \
clangd clang-format \
debootstrap \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
gfortran-aarch64-linux-gnu \
qemu-user-static
# Use debootstrap to make the sysroot
RUN debootstrap --arch=arm64 --foreign bookworm \
"$sysroot_path" "http://deb.debian.org/debian"
# Due to the foreign architecture, the 2nd-stage has to be run separately
RUN chroot "$sysroot_path" \
/debootstrap/debootstrap --second-stage
# Install more packages
RUN chroot "$sysroot_path" \
apt install -y --no-install-recommends \
libgpiod-dev \
libfmt-dev libfmt-doc libfmt9