blob: ff76a60d49f4eeedce550f74ba70e56748f85d7a [file]
#!/bin/bash
# Copyright (C) 2025 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -eux -o pipefail
# This is the initial script that runs as root in the one worker docker image
# that runs as first thing in each GCE vm.
# The docker container that runs this script is privileged. This container is
# not for isolation (the sandbox is), it's just for ease of deployment.
# The vars below are defined in config.py and set at VM creation time in the
# Makefile. It's essentially the way we pass "cmdline arguments" to a GCE vm.
ATTRS='http://metadata.google.internal/computeMetadata/v1/instance/attributes'
URL="$ATTRS/num-workers"
NUM_WORKERS=$(curl --silent --fail -H'Metadata-Flavor:Google' $URL || echo 1)
URL="$ATTRS/sandbox-img"
SANDBOX_IMG=$(curl --silent --fail -H'Metadata-Flavor:Google' $URL)
# Pull the latest images from the registry.
docker pull $SANDBOX_IMG
# Create the restricted bridge for the sandbox container.
# Prevent access to the metadata server and impersonation of service accounts.
docker network rm sandbox 2>/dev/null || true # Handles the reboot case.
docker network create sandbox -o com.docker.network.bridge.name=sandbox
iptables -I DOCKER-USER -i sandbox -d 169.254.0.0/16 -j REJECT
export PYTHONUNBUFFERED=1
# The current dir is set by the Dockerfile WORKDIR.
pwd
cat << EOF > supervisord.conf
[supervisord]
nodaemon=true
loglevel=warn
user=root
logfile=/dev/stdout
logfile_maxbytes=0
[program:sandbox_runner]
process_name=%(program_name)s_%(process_num)d
numprocs=${NUM_WORKERS}
command=python3 $(pwd)/sandbox_runner.py
environment=SANDBOX_ID="%(process_num)s"
autostart=true
autorestart=true
stdout_logfile=/dev/fd/1
stderr_logfile=/dev/fd/2
stdout_logfile_maxbytes=0
stderr_logfile_maxbytes=0
stopasgroup=true
killasgroup=true
EOF
exec supervisord -c supervisord.conf