Skip to content

Commit 4ab6262

Browse files
committed
feat: docker-login without internet. Image factory for raspberry pi
1 parent c8fbe9e commit 4ab6262

6 files changed

Lines changed: 391 additions & 86 deletions

File tree

‎image-factory/create_image.sh‎

Lines changed: 72 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,42 @@ cleanup() {
1919
}
2020
trap cleanup EXIT
2121

22+
# functions from system/cuos/utils.sh
23+
image_url() {
24+
local image
25+
image="$(jq -r \
26+
--arg prefix "${1:-}" '
27+
(
28+
if (.[$prefix + "_image"] | (type == "string" and . != "" and
29+
((startswith("/")) or (contains(".") | not)))) then
30+
.update_registry + .[$prefix + "_image"]
31+
else
32+
.[$prefix + "_image"]
33+
end
34+
) + (
35+
if .[$prefix + "_image_version"] and .[$prefix + "_image_version"] != ""then
36+
":" + .[$prefix + "_image_version"]
37+
else
38+
""
39+
end
40+
)
41+
' "${CONFIG_PATH}")"
42+
if [[ -z "${image}" ]]; then return 1; fi
43+
echo "${image}"
44+
}
45+
46+
image_version() {
47+
local image="${1:-""}"
48+
#remove registry name including :[port]
49+
image="${image##*/}"
50+
if [[ "${image}" != *:* ]]; then
51+
echo "latest"
52+
return
53+
fi
54+
local version="${image##*:}"
55+
echo "${version:-"latest"}"
56+
}
57+
2258
IMAGE="/output/image.img"
2359
IMAGE_QCOW="/output/image.qcow2"
2460
#SIZE_MB=2048
@@ -37,22 +73,41 @@ if [[ ! -f "${CONFIG_PATH}" ]]; then
3773
echo "Config file not found: ${CONFIG_PATH}"
3874
exit 1
3975
fi
40-
UPDATE_REGISTRY="$(jq -r '.update_registry' "${CONFIG_PATH}")"
41-
OS_IMAGE="$(jq -r '.os_image' "${CONFIG_PATH}")"
42-
OS_VERSION="$(jq -r '.os_image_version' "${CONFIG_PATH}")"
43-
OS_DIGEST="$(jq -r '.os_image_digest' "${CONFIG_PATH}")"
76+
export OS_ARCH="${OS_ARCH:-"$(arch)"}"
77+
78+
OS_IMAGE="$(image_url "${OS_ARCH}" || image_url "os")" || \
79+
action_on_failure "cuos:updater:os_image_not_defined" "OS image not defined"
80+
OS_DIGEST="$(jq -r --arg arch "${OS_ARCH}" '.[$arch+"_image_digest"] // .os_image_digest // empty' "${CONFIG_PATH}")"
81+
82+
83+
SIZE_MB="$(jq --arg size_mb "${SIZE_MB}" -r '.image_size_mb // $size_mb' "${CONFIG_PATH}")"
4484

4585
# Create empty image
4686
echo "Create empty image:"
4787
dd if=/dev/zero of="${IMAGE}" bs=1M count="${SIZE_MB}"
4888

49-
# Partition the image
50-
parted "${IMAGE}" --script mklabel gpt \
51-
mkpart bios_boot 1MiB 3MiB \
52-
set 1 bios_grub on \
53-
mkpart ESP fat32 3MiB 256MiB \
54-
set 2 boot on \
55-
mkpart primary btrfs 256MiB 100%
89+
if [[ "${TARGET}" == "rpi" ]]; then
90+
parted "${IMAGE}" --script \
91+
mklabel msdos \
92+
mkpart primary fat32 1MiB 256MiB \
93+
mkpart primary btrfs 256MiB 100% \
94+
set 1 boot on
95+
96+
TARGET_BOOT_PARTITION_NUM=1
97+
TARGET_ROOT_PARTITION_NUM=2
98+
else
99+
# Partition the image
100+
parted "${IMAGE}" --script \
101+
mklabel gpt \
102+
mkpart bios_boot 1MiB 3MiB \
103+
set 1 bios_grub on \
104+
mkpart ESP fat32 3MiB 256MiB \
105+
set 2 boot on \
106+
mkpart primary btrfs 256MiB 100%
107+
108+
TARGET_BOOT_PARTITION_NUM=2
109+
TARGET_ROOT_PARTITION_NUM=3
110+
fi
56111

57112
# Setup loop device
58113
LOOPDEV="$(losetup --find --show $IMAGE)"
@@ -63,9 +118,9 @@ kpartx -av "${LOOPDEV}"
63118
sleep 1
64119

65120
export TARGET_DEVICE="${LOOPDEV}"
66-
TARGET_BOOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p2"
121+
TARGET_BOOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p${TARGET_BOOT_PARTITION_NUM}"
67122
export TARGET_BOOT_PARTITION
68-
TARGET_ROOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p3"
123+
TARGET_ROOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p${TARGET_ROOT_PARTITION_NUM}"
69124
export TARGET_ROOT_PARTITION
70125

71126
# Format partitions
@@ -86,10 +141,10 @@ mkdir -p /mnt/root/@data/log
86141
umount /mnt/root
87142

88143

89-
INSTALLGRUB=true INSTALLIMAGE=true \
90-
/usr/local/updater/updater.sh \
144+
export INSTALLIMAGE=true
145+
/usr/local/updater/updater.sh \
91146
"${PARTITION}" \
92-
"${UPDATE_REGISTRY}${OS_IMAGE}:${OS_VERSION}" \
147+
"${OS_IMAGE}" \
93148
"${OS_DIGEST}"
94149

95150
EXITCODE="$?"
@@ -115,7 +170,7 @@ echo "Image created at ${IMAGE}"
115170
# RAW Universal (can be converted to others) Simple, uncompressed, large file size
116171
# OVA/OVF VMware, VirtualBox, Proxmox (via import) Bundle of disk + metadata, easy to distribute
117172

118-
qemu-img convert -f raw -O qcow2 "${IMAGE}" "${IMAGE_QCOW}"
173+
#qemu-img convert -f raw -O qcow2 "${IMAGE}" "${IMAGE_QCOW}"
119174

120175
#qemu-img convert -f raw -O vmdk image.img linux.vmdk
121176
#qemu-img convert -f raw -O vhdx image.img linux.vhdx

‎image-factory/mount_image.sh‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ partprobe "${LOOPDEV}"
3434
kpartx -av "${LOOPDEV}"
3535
sleep 1
3636

37-
TARGET_BOOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p2"
38-
TARGET_ROOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p3"
37+
if [[ "${TARGET}" == "rpi" ]]; then
38+
TARGET_BOOT_PARTITION_NUM=1
39+
TARGET_ROOT_PARTITION_NUM=2
40+
else
41+
TARGET_BOOT_PARTITION_NUM=2
42+
TARGET_ROOT_PARTITION_NUM=3
43+
fi
44+
45+
TARGET_BOOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p${TARGET_BOOT_PARTITION_NUM}"
46+
export TARGET_BOOT_PARTITION
47+
TARGET_ROOT_PARTITION="/dev/mapper/$(basename "${LOOPDEV}")p${TARGET_ROOT_PARTITION_NUM}"
48+
export TARGET_ROOT_PARTITION
3949
TARGET_BOOT="${TARGET_BOOT:-"/mnt/boot"}"
4050
TARGET_ROOT="${TARGET_ROOT:-"/mnt/os"}"
4151

@@ -46,7 +56,7 @@ mount -t btrfs -o subvol=@os "${TARGET_ROOT_PARTITION}" "${TARGET_ROOT}"
4656
mkdir -p "${TARGET_BOOT}"
4757
mount -t vfat -o "rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro" "${TARGET_BOOT_PARTITION}" "${TARGET_BOOT}"
4858

49-
bash
59+
/usr/local/updater/docker_environment.sh /bin/bash
5060

5161
umount /mnt/os
5262
umount /mnt/boot

‎image-factory/shell.sh‎

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,37 @@
11
#!/bin/bash
22

3+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
4+
export CONFIG_PATH="${SCRIPT_DIR}/../output/system.json"
5+
6+
7+
raise() {
8+
echo "Error: $*" >&2
9+
exit 1
10+
}
11+
12+
13+
OS_VERSION="${2:-"$(jq -r '.os_image_version // "latest"' "${CONFIG_PATH}")"}"
14+
15+
UPDATE_REGISTRY="$(jq -r '.update_registry' "${CONFIG_PATH}")"
16+
OS_IMAGE="cuos-image-factory"
17+
18+
19+
if [[ "${VERSION}" == "build" ]]; then
20+
IMAGE_VERSION="cuos_imagebuilder"
21+
docker build -f "Dockerfile" -t "${IMAGE_VERSION}" .. \
22+
|| raise "Failed to build image"
23+
else
24+
IMAGE_VERSION="${UPDATE_REGISTRY}${OS_IMAGE}:${OS_VERSION}"
25+
docker image pull "${IMAGE_VERSION}" \
26+
|| raise "Faild to fetch image"
27+
fi
28+
329

4-
IMAGE="dockerboot_imagebuilder"
530
docker run --rm -it \
6-
--network=host \
31+
--pull=never \
732
--privileged \
8-
-v /root/.docker/:/root/.docker/:ro \
9-
-v "${PWD}/../output/:/output/" \
10-
--name dockerboot-imagebuilder-container \
11-
--entrypoint /bin/bash \
12-
"${IMAGE}" #\
13-
# "${VERSION}"
33+
-v "${SCRIPT_DIR}/.docker_config.json":/root/.docker/config.json:ro \
34+
-v "${SCRIPT_DIR}/../output/:/output/" \
35+
--name cuos-imagebuilder-container \
36+
--entrypoint "/mount_image.sh" \
37+
"${IMAGE_VERSION}"

‎image-factory/start.sh‎

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22

33
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
4-
CONFIG_PATH="${SCRIPT_DIR}/../output/system.json"
4+
export CONFIG_PATH="${SCRIPT_DIR}/../output/system.json"
55

66

77
raise() {
@@ -10,29 +10,8 @@ raise() {
1010
}
1111

1212
dockerlogin() {
13-
## docker login:
14-
UPDATE_REGISTRY="$(jq -r '.update_registry' "${CONFIG_PATH}")"
15-
# just the server name:
16-
UPDATE_REGISTRY_SERVER="${UPDATE_REGISTRY//\/*}"
17-
18-
UPDATE_REGISTRY_USER="$(jq -r '.update_registry_user // .update_server_user // ""' "${CONFIG_PATH}")"
19-
UPDATE_REGISTRY_PASSWORD="$(jq -r '.update_registry_password // .update_server_password // ""' "${CONFIG_PATH}")"
20-
21-
22-
# Do docker login only if not already in .docker/config.json file
23-
if ! grep -q "${UPDATE_REGISTRY_SERVER}" "${HOME}/.docker/config.json" 2>/dev/null
24-
then
25-
echo "${UPDATE_REGISTRY_PASSWORD}" | docker login \
26-
"${UPDATE_REGISTRY_SERVER}" \
27-
--username "${UPDATE_REGISTRY_USER}" --password-stdin
28-
if test "$?" != "0"
29-
then
30-
echo "Error: Docker login failed" >&2
31-
exit 1
32-
fi
33-
else
34-
echo "Credentials for ${UPDATE_REGISTRY_SERVER} already existing. Skipped login."
35-
fi
13+
DOCKER_CONFIG_FILE="${SCRIPT_DIR}/.docker_config.json" \
14+
"${SCRIPT_DIR}/../system/cuos/utils-docker-login.sh"
3615
}
3716

3817
export LOCAL_CONFIG_PATH="$1"
@@ -49,10 +28,12 @@ if [[ ! -f "${CONFIG_PATH}" ]]; then
4928
exit 1
5029
fi
5130

31+
OS_ARCH="${2:-"$(arch)"}"
32+
5233
OS_VERSION="${2:-"$(jq -r '.os_image_version // "latest"' "${CONFIG_PATH}")"}"
5334

5435
UPDATE_REGISTRY="$(jq -r '.update_registry' "${CONFIG_PATH}")"
55-
OS_IMAGE="cuos-image-factory"
36+
OS_IMAGE_FACTORY="cuos-image-factory"
5637

5738

5839
dockerlogin
@@ -62,16 +43,20 @@ if [[ "${VERSION}" == "build" ]]; then
6243
docker build -f "Dockerfile" -t "${IMAGE_VERSION}" .. \
6344
|| raise "Failed to build image"
6445
else
65-
IMAGE_VERSION="${UPDATE_REGISTRY}${OS_IMAGE}:${OS_VERSION}"
46+
IMAGE_VERSION="${UPDATE_REGISTRY}${OS_IMAGE_FACTORY}:${OS_VERSION}"
6647
docker image pull "${IMAGE_VERSION}" \
6748
|| raise "Faild to fetch image"
6849
fi
6950

7051
touch "${HOME}/.docker/config.json" 2>/dev/null
52+
#cp "${HOME}/.docker/config.json" "${SCRIPT_DIR}/.docker_config.json"
53+
7154
docker run --rm \
7255
--pull=never \
7356
--privileged \
74-
-v "${HOME}/.docker/config.json":/root/.docker/config.json:ro \
57+
-v "${SCRIPT_DIR}/.docker_config.json":/root/.docker/config.json:ro \
7558
-v "${SCRIPT_DIR}/../output/:/output/" \
59+
-e "TARGET=rpi" \
60+
-e "OS_ARCH=${OS_ARCH:-}" \
7661
--name cuos-imagebuilder-container \
7762
"${IMAGE_VERSION}"

0 commit comments

Comments
 (0)