#!/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 "$@"