Files
studio-admin-be/scripts/build-image.sh
T

48 lines
2.2 KiB
Bash

#!/bin/sh
set -eu
# All clients use the same worker container on the Docker host. Limits are
# aggregate, including builds submitted simultaneously by API and CI clients.
docker_bin=${DOCKER_BIN:-docker}
builder=studio-limited
node=${builder}0
container=buildx_buildkit_${node}
directory=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
image=moby/buildkit@sha256:28a898719c18a33f4e8000685287fa36fd0dd9560c6440227d3a732d79bb41d8
"$docker_bin" buildx version >/dev/null
if ! "$docker_bin" buildx inspect "$builder" >/dev/null 2>&1; then
config_flag=--config
if "$docker_bin" buildx create --help | grep -q -- --buildkitd-config; then
config_flag=--buildkitd-config
fi
# Another caller may have registered the builder in this client config first.
"$docker_bin" buildx create --name "$builder" --node "$node" \
--driver docker-container \
--driver-opt "image=$image,memory=8g,memory-swap=8g,cpu-period=100000,cpu-quota=200000,network=host,restart-policy=unless-stopped" \
"$config_flag" "$directory/buildkitd.toml" >/dev/null \
|| "$docker_bin" buildx inspect "$builder" >/dev/null
fi
info=$("$docker_bin" buildx inspect "$builder")
driver=$(printf '%s\n' "$info" | awk '$1 == "Driver:" {print $2}')
[ "$driver" = docker-container ] || { echo 'Refusing unrestricted build driver' >&2; exit 1; }
names=$(printf '%s\n' "$info" | awk '$1 == "Name:" {print $2}')
[ "$names" = "$(printf '%s\n%s' "$builder" "$node")" ] || {
echo 'Refusing unexpected builder nodes' >&2; exit 1
}
"$docker_bin" buildx inspect "$builder" --bootstrap >/dev/null
limits=$("$docker_bin" inspect "$container" --format '{{.HostConfig.CpuPeriod}} {{.HostConfig.CpuQuota}} {{.HostConfig.Memory}} {{.HostConfig.MemorySwap}}')
[ "$limits" = '100000 200000 8589934592 8589934592' ] || {
echo "Refusing build: unexpected worker limits: $limits" >&2
exit 1
}
echo '[limits] shared image builder: 2 CPUs, 8 GiB RAM, no swap'
if [ "${1:-}" = --prepare-only ]; then exit 0; fi
if [ "${1:-}" = --artifact-output ]; then
destination=$2
shift 2
exec "$docker_bin" buildx build --builder "$builder" --output "type=local,dest=$destination" --progress plain "$@"
fi
exec "$docker_bin" buildx build --builder "$builder" --load --progress plain "$@"