summaryrefslogtreecommitdiffstats
path: root/recipes-containers/vcontainer/vdkr-rootfs-image.bb
blob: 4a0c8a104e97e837074589528e1f1fcfcc7e3f56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# SPDX-FileCopyrightText: Copyright (C) 2025 Bruce Ashfield
#
# SPDX-License-Identifier: MIT
#
# vdkr-rootfs-image.bb
# Minimal Docker-capable image for vdkr QEMU environment
#
# This image is built via multiconfig and used by vdkr-initramfs-create
# to provide a proper rootfs for running Docker in QEMU.
#
# Build with:
#   bitbake mc:vruntime-aarch64:vdkr-rootfs-image
#   bitbake mc:vruntime-x86-64:vdkr-rootfs-image
#
# Optional baked-in registry defaults (can still be overridden via CLI):
# Uses the same variables as container-registry infrastructure:
#   CONTAINER_REGISTRY_URL = "10.0.2.2:5000"
#   CONTAINER_REGISTRY_NAMESPACE = "yocto"
#   CONTAINER_REGISTRY_INSECURE = "1"  (or DOCKER_REGISTRY_INSECURE)

SUMMARY = "Minimal Docker rootfs for vdkr"
DESCRIPTION = "A minimal image containing Docker tools for use with vdkr. \
               This image runs inside QEMU to provide Docker command execution."

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

# Track init script changes via file-checksums
# This adds the file content hash to the task signature
do_rootfs[file-checksums] += "${THISDIR}/files/vdkr-init.sh:True"
do_rootfs[file-checksums] += "${THISDIR}/files/vcontainer-init-common.sh:True"

# Force do_rootfs to always run (no stamp caching)
# Combined with file-checksums, this ensures init script changes are picked up
do_rootfs[nostamp] = "1"

# Inherit from core-image-minimal for a minimal base
inherit core-image

# We need Docker and container tools
IMAGE_INSTALL = " \
    packagegroup-core-boot \
    docker-moby \
    containerd \
    runc \
    skopeo \
    busybox \
    iproute2 \
    iptables \
    util-linux \
"

# No extra features needed
IMAGE_FEATURES = ""

# Keep the image small
IMAGE_ROOTFS_SIZE = "524288"
IMAGE_ROOTFS_EXTRA_SPACE = "0"

# Registry defaults - reuse common container-registry variables
# Empty URL means no baked config (can still configure via CLI)
CONTAINER_REGISTRY_URL ?= ""
CONTAINER_REGISTRY_NAMESPACE ?= "yocto"
CONTAINER_REGISTRY_INSECURE ?= "0"
DOCKER_REGISTRY_INSECURE ?= ""

# Use squashfs for smaller size (~3x compression)
# The preinit mounts squashfs read-only with tmpfs overlay for writes
IMAGE_FSTYPES = "squashfs"

# Install our init script
ROOTFS_POSTPROCESS_COMMAND += "install_vdkr_init;"

install_vdkr_init() {
    # Install vdkr-init.sh as /init and vcontainer-init-common.sh alongside it
    install -m 0755 ${THISDIR}/files/vdkr-init.sh ${IMAGE_ROOTFS}/init
    install -m 0755 ${THISDIR}/files/vcontainer-init-common.sh ${IMAGE_ROOTFS}/vcontainer-init-common.sh

    # Create required directories
    install -d ${IMAGE_ROOTFS}/mnt/input
    install -d ${IMAGE_ROOTFS}/mnt/state
    install -d ${IMAGE_ROOTFS}/var/lib/docker
    install -d ${IMAGE_ROOTFS}/run/containerd

    # Create skopeo policy
    install -d ${IMAGE_ROOTFS}/etc/containers
    echo '{"default":[{"type":"insecureAcceptAnything"}]}' > ${IMAGE_ROOTFS}/etc/containers/policy.json

    # Create baked-in registry config if specified
    # Uses common CONTAINER_REGISTRY_* variables for consistency
    # These defaults can be overridden via kernel cmdline (docker_registry=)
    #
    # NOTE: localhost URLs are auto-translated to 10.0.2.2 for QEMU slirp networking
    # This allows CONTAINER_REGISTRY_URL=localhost:5000 to work for both:
    #   - Host-side operations (registry script, pushing)
    #   - vdkr inside QEMU (via 10.0.2.2 slirp gateway)
    install -d ${IMAGE_ROOTFS}/etc/vdkr
    if [ -n "${CONTAINER_REGISTRY_URL}" ]; then
        cat > ${IMAGE_ROOTFS}/etc/vdkr/registry.conf << 'VDKR_EOF'
# vdkr registry defaults (baked at build time)
# These can be overridden via:
#   - Kernel cmdline: docker_registry=... docker_insecure_registry=...
#   - vdkr CLI: vdkr --registry ... or vdkr vconfig registry ...
VDKR_EOF
        # Build registry URL with namespace
        # Translate localhost to 10.0.2.2 for QEMU slirp networking
        QEMU_REGISTRY_URL=$(echo "${CONTAINER_REGISTRY_URL}" | sed 's/^localhost/10.0.2.2/' | sed 's/^127\.0\.0\.1/10.0.2.2/')
        echo "VDKR_DEFAULT_REGISTRY=\"${QEMU_REGISTRY_URL}/${CONTAINER_REGISTRY_NAMESPACE}\"" >> ${IMAGE_ROOTFS}/etc/vdkr/registry.conf

        # Handle insecure registries - check both DOCKER_REGISTRY_INSECURE and CONTAINER_REGISTRY_INSECURE
        INSECURE_LIST="${DOCKER_REGISTRY_INSECURE}"
        if [ "${CONTAINER_REGISTRY_INSECURE}" = "1" ] && [ -n "${QEMU_REGISTRY_URL}" ]; then
            # Use the QEMU-translated URL for insecure list
            INSECURE_LIST="${INSECURE_LIST} ${QEMU_REGISTRY_URL}"
        fi
        # Also translate any localhost entries in the insecure list
        INSECURE_LIST=$(echo "${INSECURE_LIST}" | sed 's/localhost/10.0.2.2/g' | sed 's/127\.0\.0\.1/10.0.2.2/g')
        if [ -n "${INSECURE_LIST}" ]; then
            echo "VDKR_INSECURE_REGISTRIES=\"${INSECURE_LIST}\"" >> ${IMAGE_ROOTFS}/etc/vdkr/registry.conf
        fi
        bbnote "Created vdkr registry config: ${QEMU_REGISTRY_URL}/${CONTAINER_REGISTRY_NAMESPACE}"
    fi
}