-
Notifications
You must be signed in to change notification settings - Fork 50
Docker Support #555
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Docker Support #555
Changes from all commits
e327b20
347a33b
3e532d3
4d95de0
6074e77
35d4211
8e2d95c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| # SPDX-FileCopyrightText: 2024 Lance Vick <lance@vick.house> | ||
| # | ||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||
|
|
||
|
|
||
| !target |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| # SPDX-FileCopyrightText: 2024 Lance Vick <lance@vick.house> | ||
| # SPDX-FileCopyrightText: 2025 Kevin Nause <kevin@nause.engineering> | ||
| # | ||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||
|
|
||
| ARG ARCH=x86 | ||
| ARG USER=user | ||
| ARG UID=1000 | ||
| ARG GID=1000 | ||
| ARG HOME=/home/${USER} | ||
|
|
||
| FROM scratch AS build | ||
| ARG TARGET | ||
| ARG INIT | ||
| COPY ${TARGET} / | ||
|
|
||
| FROM build AS build-aarch64 | ||
| RUN ["/bootstrap-seeds/POSIX/AArch64/kaem-optional-seed"] | ||
|
|
||
| FROM build AS build-amd64 | ||
| RUN ["/bootstrap-seeds/POSIX/AMD64/kaem-optional-seed"] | ||
|
|
||
| FROM build AS build-riscv32 | ||
| RUN ["/bootstrap-seeds/POSIX/riscv32/kaem-optional-seed"] | ||
|
|
||
| FROM build AS build-riscv64 | ||
| RUN ["/bootstrap-seeds/POSIX/riscv64/kaem-optional-seed"] | ||
|
|
||
| FROM build AS build-x86 | ||
| RUN ["/bootstrap-seeds/POSIX/x86/kaem-optional-seed"] | ||
|
|
||
| FROM build-${ARCH} AS install | ||
| ARG USER | ||
| ARG UID | ||
| ARG GID | ||
| ARG HOME | ||
| ENV PATH=/bin:/usr/sbin:/usr/bin | ||
| RUN set -eu; \ | ||
| rm -rf /usr/lib/python*/__pycache__; \ | ||
| mkdir -p /rootfs/etc /rootfs/${HOME}; \ | ||
| cp -R $(ls -d /etc/* | grep -v '\(resolv.conf\|hosts\)') /rootfs/etc/; \ | ||
| cp -R lib usr bin var /rootfs/; \ | ||
| echo "${USER}:x:${GID}:" > /rootfs/etc/group; \ | ||
| echo "${USER}:x:${UID}:${GID}::${HOME}:/bin/bash" > /rootfs/etc/passwd; \ | ||
| find /rootfs -exec touch -hcd "@0" "{}" + | ||
|
|
||
| FROM scratch AS package | ||
| ARG UID | ||
| ARG GID | ||
| COPY --from=install /rootfs / | ||
| USER ${UID}:${GID} | ||
| ENTRYPOINT ["/bin/bash"] | ||
| ENV TZ=UTC | ||
| ENV LANG=C.UTF-8 | ||
| ENV SOURCE_DATE_EPOCH=1 | ||
| ENV KCONFIG_NOTIMESTAMP=1 | ||
|
Comment on lines
+55
to
+56
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would probably be better for these to be 0 in line with what we use everywhere else. |
||
| ENV PS1="bootstrap$ " | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,6 +13,8 @@ | |
| # SPDX-FileCopyrightText: 2021 Melg Eight <public.melg8@gmail.com> | ||
| # SPDX-FileCopyrightText: 2021-23 Samuel Tyler <samuel@samuelt.me> | ||
| # SPDX-FileCopyrightText: 2023-24 Gábor Stefanik <netrolller.3d@gmail.com> | ||
| # SPDX-FileCopyrightText: 2024 Lance Vick <lance@vick.house> | ||
| # SPDX-FileCopyrightText: 2025 Kevin Nause <kevin@nause.engineering> | ||
|
|
||
| import argparse | ||
| import os | ||
|
|
@@ -34,7 +36,7 @@ def create_configuration_file(args): | |
| config.write(f"ARCH={args.arch}\n") | ||
| config.write(f"ARCH_DIR={stage0_arch_map.get(args.arch, args.arch)}\n") | ||
| config.write(f"FORCE_TIMESTAMPS={args.force_timestamps}\n") | ||
| config.write(f"CHROOT={args.chroot or args.bwrap}\n") | ||
| config.write(f"CHROOT={args.chroot or args.bwrap or args.docker}\n") | ||
| config.write(f"UPDATE_CHECKSUMS={args.update_checksums}\n") | ||
| config.write(f"JOBS={args.cores}\n") | ||
| config.write(f"SWAP_SIZE={args.swap}\n") | ||
|
|
@@ -75,6 +77,8 @@ def main(): | |
| action="store_true") | ||
| parser.add_argument("-bw", "--bwrap", help="Run inside a bwrap sandbox", | ||
| action="store_true") | ||
| parser.add_argument("-do", "--docker", help="Run inside a docker build", | ||
| action="store_true") | ||
| parser.add_argument("-t", "--target", help="Target directory", | ||
| default="target") | ||
| parser.add_argument("--tmpfs", help="Use a tmpfs on target", | ||
|
|
@@ -140,15 +144,17 @@ def check_types(): | |
| count += 1 | ||
| if args.bwrap: | ||
| count += 1 | ||
| if args.docker: | ||
| count += 1 | ||
| if args.bare_metal: | ||
| count += 1 | ||
| return count | ||
|
|
||
| if check_types() > 1: | ||
| raise ValueError("No more than one of qemu, chroot, bwrap, bare metal" | ||
| raise ValueError("No more than one of qemu, chroot, bwrap, docker, bare metal" | ||
| "may be used.") | ||
| if check_types() == 0: | ||
| raise ValueError("One of qemu, chroot, bwrap, or bare metal must be selected.") | ||
| raise ValueError("One of qemu, chroot, bwrap, docker, or bare metal must be selected.") | ||
|
|
||
| # Arch validation | ||
| if args.arch != "x86": | ||
|
|
@@ -171,6 +177,9 @@ def check_types(): | |
| else: | ||
| args.target_size = 0 | ||
|
|
||
| if args.docker: | ||
| args.external_sources = True | ||
|
|
||
| # Swap file size validation | ||
| if args.qemu or args.bare_metal: | ||
| args.swap = (int(str(args.swap).rstrip('gGmM')) * | ||
|
|
@@ -250,6 +259,22 @@ def bootstrap(args, generator, target, size, cleanup): | |
| run_as_root('env', '-i', 'PATH=/bin', chroot_binary, generator.target_dir, init, | ||
| cleanup=cleanup) | ||
|
|
||
| elif args.docker: | ||
| generator.prepare(target, using_kernel=False) | ||
| arch = stage0_arch_map.get(args.arch, args.arch) | ||
| init = os.path.join(os.sep, 'bootstrap-seeds', 'POSIX', arch, 'kaem-optional-seed') | ||
| target_rel = os.path.relpath(generator.target_dir, os.getcwd()) | ||
| run('env', '-i', 'DOCKER_BUILDKIT=1', | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why do we hardcode DOCKER_BUILDKIT=1 here? Won't this cause needless failures on systems without BuildKit installed (e.g. systems with older Docker versions)?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It was a part of #413. If you don't want it, remove it.
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you willing to guide this PR to a mergeable state? This needs addressing from my perspective to be merged. If you aren't willing to guide this PR to be merged, that's fine - no one owes anyone anything in open source - but I won't keep this PR open indefinitely in that case. |
||
| 'docker', 'build', | ||
| '--build-arg=ARCH='+ arch, | ||
| '--build-arg=TARGET=' + target_rel, | ||
| '--build-arg=SOURCE_DATE_EPOCH=1', | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar to above, let's make this 0. |
||
| '--progress=auto', | ||
| '--platform=linux/amd64,linux/arm64,linux/i386,linux/riscv64', | ||
| '--target=package', | ||
| '--tag=live-bootstrap-' + arch, | ||
| '.') | ||
|
|
||
| elif args.bwrap: | ||
| init = '/init' | ||
| if not args.internal_ci or args.internal_ci == "pass1": | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you know what the purpose of all this is?