Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit aabbc84

Browse files
committed
First steps to build system
1 parent c75e371 commit aabbc84

File tree

6 files changed

+272
-0
lines changed

6 files changed

+272
-0
lines changed

tools/@base/Dockerfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ RUN --mount=type=cache,target=/var/cache/apt \
1010
jq \
1111
&& rm /usr/local/sbin/unminimize
1212

13+
ARG prefix
14+
ARG target=/usr/local
15+
ARG arch=x86_64
16+
ARG alt_arch=amd64
17+
18+
ENV docker_setup_cache=/var/cache/docker_setup \
19+
docker_setup_contrib=/var/lib/docker_setup/contrib \
20+
prefix=${prefix} \
21+
target=${target} \
22+
arch=${arch} \
23+
alt_arch=${alt_arch}
24+
1325
LABEL org.opencontainers.image.source="https://github.com/nicholasdille/docker-setup" \
1426
org.opencontainers.image.ref.name="oras" \
1527
org.opencontainers.image.title="Base image" \

tools/Makefile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
M = $(shell printf "\033[34;1m▶\033[0m")
2+
GIT_BRANCH = $(shell git branch --show-current)
3+
TOOLS = docker trivy
4+
PREFIX =
5+
TARGET = /usr/local
6+
7+
base: ; $(info $(M) Building base image...)
8+
@\
9+
docker build @base \
10+
--build-arg x-prefix=$(PREFIX) \
11+
--build-arg x-target=$(TARGET) \
12+
--tag ghcr.io/nicholasdille/docker-setup/base:$(GIT_BRANCH) \
13+
--load
14+
15+
$(TOOLS): base ; $(info $(M) Building image for $@...)
16+
@\
17+
docker build $@ \
18+
--build-arg branch=$(GIT_BRANCH) \
19+
--build-arg reg=$(GIT_BRANCH) \
20+
--tag ghcr.io/nicholasdille/docker-setup/$@:$(GIT_BRANCH) \
21+
--load \
22+
--progress plain \
23+
--no-cache

tools/docker/Dockerfile

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#syntax=docker/dockerfile:1.4.2
2+
3+
ARG branch=main
4+
FROM ghcr.io/nicholasdille/docker-setup/base:${branch} AS prepare
5+
6+
ARG ref=main
7+
ARG name=docker
8+
ARG version=20.10.17
9+
10+
RUN printenv | sort
11+
12+
RUN curl -sL "https://download.docker.com/linux/static/stable/${arch}/docker-${version}.tgz" \
13+
| tar -xz --directory=${prefix}${target}/libexec/docker/bin --no-same-owner --strip-components=1
14+
RUN curl -sL "https://download.docker.com/linux/static/stable/${arch}/docker-rootless-extras-${version}.tgz" \
15+
| tar -xz --directory=${prefix}${target}/libexec/docker/bin --no-same-owner --strip-components=1
16+
RUN curl -sL "https://github.com/nicholasdille/docker-cli-manpages/releases/download/v${version}/docker-cli-manpages.tar.gz" \
17+
| tar -xz --directory=${prefix}${target} --no-same-owner
18+
RUN curl -sLo "${prefix}${target}/share/bash-completion/completions/docker" \
19+
"https://github.com/docker/cli/raw/v${version}/contrib/completion/bash/docker"
20+
RUN curl -sLo "${prefix}${target}/share/fish/vendor_completions.d/docker.fish" \
21+
"https://github.com/docker/cli/raw/v${version}/contrib/completion/fish/docker.fish"
22+
RUN curl -sLo "${prefix}${target}/share/zsh/vendor-completions/_docker" \
23+
"https://github.com/docker/cli/raw/v${version}/contrib/completion/zsh/_docker"
24+
RUN curl -sLo "${prefix}/etc/systemd/system/docker.service" \
25+
"https://github.com/moby/moby/raw/v${version}/contrib/init/systemd/docker.service"
26+
RUN curl -sLo "${prefix}/etc/systemd/system/docker.socket" \
27+
"https://github.com/moby/moby/raw/v${version}/contrib/init/systemd/docker.socket"
28+
RUN curl -sLo "${docker_setup_contrib}/${tool}/sysvinit/debian/docker.default" \
29+
"https://github.com/moby/moby/raw/v${version}/contrib/init/sysvinit-debian/docker.default"
30+
RUN curl -sLo "${docker_setup_contrib}/${tool}/sysvinit/debian/docker" \
31+
"https://github.com/moby/moby/raw/v${version}/contrib/init/sysvinit-debian/docker"
32+
RUN curl -sLo "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker.sysconfig" \
33+
"https://github.com/moby/moby/raw/v${version}/contrib/init/sysvinit-redhat/docker.sysconfig"
34+
RUN curl -sLo "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker" \
35+
"https://github.com/moby/moby/raw/v${version}/contrib/init/sysvinit-redhat/docker"
36+
RUN curl -sLo "${docker_setup_contrib}/${tool}/openrc/docker.confd" \
37+
"https://github.com/moby/moby/raw/v${version}/contrib/init/openrc/docker.confd"
38+
RUN curl -sLo "${docker_setup_contrib}/${tool}/openrc/docker.initd" \
39+
"https://github.com/moby/moby/raw/v${version}/contrib/init/openrc/docker.initd"
40+
COPY post_install.sh ${docker_setup_post_install}/${name}/
41+
42+
FROM scratch
43+
COPY --from=prepare --link /usr/local/ /usr/local/
44+
45+
LABEL org.opencontainers.image.source="https://github.com/nicholasdille/docker-setup" \
46+
org.opencontainers.image.ref.name="${ref}" \
47+
org.opencontainers.image.title="${name}" \
48+
org.opencontainers.image.description="${name} packaged for installation" \
49+
org.opencontainers.image.version="${version}"

tools/docker/docker.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name: docker
2+
version: 20.10.17
3+
dependencies:
4+
runtime:
5+
- fuse-overlayfs
6+
tags:
7+
- default
8+
- docker
9+
- runtime
10+
- build
11+
- oci

tools/docker/post_install.sh

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#!/bin/bash
2+
3+
echo "Move binaries (@ ${SECONDS} seconds)"
4+
mv "${target}/libexec/docker/bin/dockerd" "${target}/bin"
5+
mv "${target}/libexec/docker/bin/docker" "${target}/bin"
6+
mv "${target}/libexec/docker/bin/docker-proxy" "${target}/bin"
7+
8+
echo "Move rootless scripts (@ ${SECONDS} seconds)"
9+
mv "${target}/libexec/docker/bin/dockerd-rootless.sh" "${target}/bin"
10+
mv "${target}/libexec/docker/bin/dockerd-rootless-setuptool.sh" "${target}/bin"
11+
echo "Binaries installed after ${SECONDS} seconds."
12+
13+
echo "Patch paths in systemd unit files (@ ${SECONDS} seconds)"
14+
sed -i "/^\[Service\]/a Environment=PATH=${relative_target}/libexec/docker/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" "${prefix}/etc/systemd/system/docker.service"
15+
sed -i -E "s|/usr/bin/dockerd|${relative_target}/bin/dockerd|" "${prefix}/etc/systemd/system/docker.service"
16+
17+
echo "Patch paths in init scripts (@ ${SECONDS} seconds)"
18+
sed -i -E "s|^(export PATH=)|\1${relative_target}/libexec/docker/bin:|" "${docker_setup_contrib}/${tool}/sysvinit/debian/docker"
19+
sed -i -E "s|^DOCKERD=/usr/bin/dockerd|DOCKERD=${relative_target}/bin/dockerd|" "${docker_setup_contrib}/${tool}/sysvinit/debian/docker"
20+
chmod +x "${docker_setup_contrib}/${tool}/sysvinit/debian/docker"
21+
sed -i -E "s|(^prog=)|export PATH="${relative_target}/libexec/docker/bin:${relative_target}/sbin:${relative_target}/bin:\${PATH}"\n\n\1|" "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker"
22+
sed -i -E "s|/usr/bin/dockerd|${relative_target}/bin/dockerd|" "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker"
23+
chmod +x "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker"
24+
sed -i -E "s|^(command=)|export PATH="${relative_target}/libexec/docker/bin:\${PATH}"\n\n\1|" "${docker_setup_contrib}/${tool}/openrc/docker.initd"
25+
sed -i "s|/usr/bin/dockerd|${relative_target}/bin/dockerd|" "${docker_setup_contrib}/${tool}/openrc/docker.initd"
26+
sed -i "s|/usr/bin/dockerd|${relative_target}/bin/dockerd|" "${docker_setup_contrib}/${tool}/openrc/docker.confd"
27+
chmod +x "${docker_setup_contrib}/${tool}/openrc/docker.initd"
28+
29+
if test -f "${prefix}/etc/group"; then
30+
echo "Create group (@ ${SECONDS} seconds)"
31+
groupadd --prefix "${prefix}" --system --force docker
32+
fi
33+
34+
echo "Configure daemon (@ ${SECONDS} seconds)"
35+
mkdir -p "${prefix}/etc/docker"
36+
if ! test -f "${prefix}/etc/docker/daemon.json"; then
37+
echo "Initialize dockerd configuration"
38+
echo "{}" >"${prefix}/etc/docker/daemon.json"
39+
fi
40+
41+
if test -f "${prefix}/etc/fstab"; then
42+
root_fs="$(cat "${prefix}/etc/fstab" | tr -s ' ' | grep " / " | cut -d' ' -f3)"
43+
if test -z "${root_fs}"; then
44+
root_fs="$(mount | grep " on / " | cut -d' ' -f5)"
45+
fi
46+
echo "Found ${root_fs} on /"
47+
48+
if test "${root_fs}" == "overlay"; then
49+
50+
if has_tool "fuse-overlayfs" || tool_will_be_installed "fuse-overlayfs"; then
51+
info "Waiting for fuse-overlayfs to be installed"
52+
wait_for_tool "fuse-overlayfs"
53+
54+
echo "Configuring storage driver for DinD"
55+
# shellcheck disable=SC2094
56+
cat <<< "$(jq '. * {"storage-driver": "fuse-overlayfs"}' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
57+
58+
else
59+
warning "fuse-overlayfs should be planned for installation."
60+
fi
61+
touch "${docker_setup_cache}/docker_restart"
62+
fi
63+
fi
64+
65+
if ! test "$(jq '."exec-opts" // [] | any(. | startswith("native.cgroupdriver="))' "${prefix}/etc/docker/daemon.json")" == "true"; then
66+
echo "Configuring native cgroup driver"
67+
# shellcheck disable=SC2094
68+
cat <<< "$(jq '."exec-opts" += ["native.cgroupdriver=cgroupfs"]' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
69+
touch "${docker_setup_cache}/docker_restart"
70+
fi
71+
if ! test "$(jq '. | keys | any(. == "default-runtime")' "${prefix}/etc/docker/daemon.json")" == true; then
72+
echo "Set default runtime"
73+
# shellcheck disable=SC2094
74+
cat <<< "$(jq '. * {"default-runtime": "runc"}' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
75+
touch "${docker_setup_cache}/docker_restart"
76+
fi
77+
# shellcheck disable=SC2016
78+
if test -n "${docker_address_base}" && test -n "${docker_address_size}" && ! test "$(jq --arg base "${docker_address_base}" --arg size "${docker_address_size}" '."default-address-pool" | any(.base == $base and .size == $size)' "${prefix}/etc/docker/daemon.json")" == "true"; then
79+
echo "Add address pool with base ${docker_address_base} and size ${docker_address_size}"
80+
# shellcheck disable=SC2094
81+
cat <<< "$(jq --args base "${docker_address_base}" --arg size "${docker_address_size}" '."default-address-pool" += {"base": $base, "size": $size}' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
82+
touch "${docker_setup_cache}/docker_restart"
83+
fi
84+
# shellcheck disable=SC2016
85+
if test -n "${docker_hub_mirror}" && ! test "$(jq --arg mirror "${docker_hub_mirror}" '."registry-mirrors" // [] | any(. == $mirror)' "${prefix}/etc/docker/daemon.json")" == "true"; then
86+
echo "Add registry mirror ${docker_hub_mirror}"
87+
# shellcheck disable=SC2094
88+
# shellcheck disable=SC2016
89+
cat <<< "$(jq --args mirror "${docker_hub_mirror}" '."registry-mirrors" += ["\($mirror)"]' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
90+
touch "${docker_setup_cache}/docker_restart"
91+
fi
92+
if ! test "$(jq --raw-output '.features.buildkit // false' "${prefix}/etc/docker/daemon.json")" == true; then
93+
echo "Enable BuildKit"
94+
# shellcheck disable=SC2094
95+
cat <<< "$(jq '. * {"features":{"buildkit":true}}' "${prefix}/etc/docker/daemon.json")" >"${prefix}/etc/docker/daemon.json"
96+
touch "${docker_setup_cache}/docker_restart"
97+
fi
98+
echo "Check if daemon.json is valid JSON (@ ${SECONDS} seconds)"
99+
if ! jq --exit-status '.' "${prefix}/etc/docker/daemon.json" >/dev/null 2>&1; then
100+
error "${prefix}/etc/docker/daemon.json is not valid JSON."
101+
exit 1
102+
fi
103+
104+
if docker_is_running; then
105+
touch "${docker_setup_cache}/docker_already_present"
106+
echo "Found that Docker is already present after ${SECONDS} seconds."
107+
warning "Docker is already running. Skipping init script and daemon configuration."
108+
109+
else
110+
if is_debian || is_clearlinux; then
111+
echo "Install init script for debian"
112+
mkdir -p "${prefix}/etc/default" "${prefix}/etc/init.d"
113+
cp "${docker_setup_contrib}/${tool}/sysvinit/debian/docker.default" "${prefix}/etc/default/docker"
114+
cp "${docker_setup_contrib}/${tool}/sysvinit/debian/docker" "${prefix}/etc/init.d/docker"
115+
116+
elif is_redhat; then
117+
echo "Install init script for redhat"
118+
mkdir -p "${prefix}/etc/sysconfig" "${prefix}/etc/init.d"
119+
cp "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker.sysconfig" "${prefix}/etc/sysconfig/docker"
120+
cp "${docker_setup_contrib}/${tool}/sysvinit/redhat/docker" "${prefix}/etc/init.d/docker"
121+
122+
elif is_alpine; then
123+
echo "Install openrc script for alpine"
124+
mkdir -p "${prefix}/etc/conf.d" "${prefix}/etc/init.d"
125+
cp "${docker_setup_contrib}/${tool}/openrc/docker.confd" "${prefix}/etc/conf.d/docker"
126+
cp "${docker_setup_contrib}/${tool}/openrc/docker.initd" "${prefix}/etc/init.d/docker"
127+
openrc
128+
else
129+
warning "Unable to install init script because the distributon is unknown."
130+
fi
131+
132+
if test -z "${prefix}"; then
133+
if has_systemd; then
134+
echo "Reload systemd (@ ${SECONDS} seconds)"
135+
systemctl daemon-reload
136+
if ! systemctl is-active --quiet docker; then
137+
echo "Start dockerd (@ ${SECONDS} seconds)"
138+
systemctl enable docker
139+
systemctl start docker
140+
touch "${docker_setup_cache}/docker_restart_allowed"
141+
fi
142+
else
143+
if ! docker_is_running; then
144+
echo "Start dockerd (@ ${SECONDS} seconds)"
145+
"${prefix}/etc/init.d/docker" start
146+
touch "${docker_setup_cache}/docker_restart_allowed"
147+
fi
148+
warning "Init script was installed but you must enable Docker yourself."
149+
fi
150+
fi
151+
echo "Wait for Docker daemon to start (@ ${SECONDS} seconds)"
152+
153+
wait_for_docker
154+
if ! docker_is_running; then
155+
error "Failed to start Docker."
156+
exit 1
157+
fi
158+
echo "Finished starting Docker after ${SECONDS} seconds."
159+
fi
160+
echo "Finished after ${SECONDS} seconds."

tools/docker/renovate.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
3+
"regexManagers": [
4+
{
5+
"fileMatch": [
6+
"^tools.yaml$"
7+
],
8+
"matchStrings": [
9+
"name: docker\\n\\s+version: \"?(?<currentValue>.*?)\"?\\n",
10+
"name: docker-manpages\\n\\s+version: \"?(?<currentValue>.*?)\"?\\n"
11+
],
12+
"depNameTemplate": "moby/moby",
13+
"datasourceTemplate": "github-tags",
14+
"extractVersionTemplate": "^v(?<version>.+?)$"
15+
}
16+
]
17+
}

0 commit comments

Comments
 (0)