mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-07 21:16:57 +02:00
When started by the Flatcar core user, the SDK failed to use UID 500 because inside the SDK there already is the core user from nss-altfiles with the same ID. This way, the SDK user was continuing with UID 1000 and had permission errors. Allow to reuse an existing ID for the SDK user. However, this only works when usermod doesn't find a process that uses this ID, and we had a race between the SDK entry points called by "docker start" and by "docker exec". The race is unwanted anyway because we don't want to execute the commands while setup_board is still running. Solve it by setting the entrypoint for "docker start" directly to "bash -l" in "docker create" (this is also what the entry point does as last step: sudo su -l).
151 lines
5.4 KiB
Bash
Executable File
151 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2021 The Flatcar Maintainers.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
set -euo pipefail
|
|
|
|
cd $(dirname "$0")
|
|
source sdk_lib/sdk_container_common.sh
|
|
|
|
arch="all"
|
|
name=""
|
|
|
|
os_version="$(get_git_version)"
|
|
sdk_version="$(get_sdk_version_from_versionfile)"
|
|
custom_image=""
|
|
tty=""
|
|
remove=""
|
|
cleanup=""
|
|
|
|
usage() {
|
|
echo " Usage:"
|
|
echo " $0 [-t] [-v <version>] [-V sdk version] [-a arch] [-n <name> ] [-x <script>] [-C custom-container] [--rm] [container-command]"
|
|
echo " Start an SDK container of a given SDK release version."
|
|
echo " This will create the container if it does not exist, otherwise start the existing container."
|
|
echo " If the container is already running then it will exec into the container."
|
|
echo
|
|
echo " container-command - command to be run in the container instead of"
|
|
echo " an interactive shell."
|
|
echo " -t Attach docker to a TTY (docker -t)"
|
|
echo " -v <version> - Sourcetree (OS image) version to use."
|
|
echo " Defaults to '$os_version' (current git commit)."
|
|
echo " FLATCAR_VERSION[_ID] in '$sdk_container_common_versionfile'"
|
|
echo " will be updated accordingly."
|
|
echo " -V <SDK ver> - SDK version to use. Defaults to '${sdk_version}'"
|
|
echo " (FLATCAR_SDK_VERSION from '$sdk_container_common_versionfile')."
|
|
echo " -a <amd64|arm64|all> - Target architecture (board support) of the SDK."
|
|
echo " 'all' (the default) contains support for both amd64 and arm64."
|
|
echo " -n <name> - Custom name to use for the container."
|
|
echo " --rm Remove container afterwards"
|
|
echo " -x <script> - For each resource generated during build (container etc.)"
|
|
echo " add a cleanup line to <script> which, when run, will free"
|
|
echo " the resource. Useful for CI."
|
|
echo " -C - Use an entirely custom container image instead of the SDK's"
|
|
echo " $sdk_container_common_registry/flatcar-sdk-[ARCH]:[SDK VERSION]"
|
|
echo " Useful for CI."
|
|
echo " -h Print this help."
|
|
echo
|
|
}
|
|
# --
|
|
|
|
while [ 0 -lt $# ] ; do
|
|
case "$1" in
|
|
-h) usage; exit 0;;
|
|
--help) usage; exit 0;;
|
|
-t) tty="-t"; shift;;
|
|
-v) os_version="$2"; shift; shift;;
|
|
-V) sdk_version="$2"; shift; shift;;
|
|
-a) arch="$2"; shift; shift;;
|
|
-n) name="$2"; shift; shift;;
|
|
--rm) remove=true; shift;;
|
|
-x) cleanup="$2"; shift; shift;;
|
|
-C) custom_image="$2"; shift; shift;;
|
|
*) break;;
|
|
esac
|
|
done
|
|
|
|
if [ -n "$custom_image" ] ; then
|
|
container_image_name="${custom_image}"
|
|
else
|
|
docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
|
|
container_image_name="$sdk_container_common_registry/flatcar-sdk-${arch}:${docker_sdk_vernum}"
|
|
fi
|
|
|
|
create_versionfile "$sdk_version" "$os_version"
|
|
|
|
if [ -z "$name" ] ; then
|
|
docker_sdk_vernum="$(vernum_to_docker_image_version "${sdk_version}")"
|
|
docker_os_vernum="$(vernum_to_docker_image_version "${os_version}")"
|
|
name="flatcar-sdk-${arch}-${docker_sdk_vernum}_os-${docker_os_vernum}"
|
|
fi
|
|
|
|
filter="^/"
|
|
if "${is_podman}"; then
|
|
filter=""
|
|
fi
|
|
stat="$($docker ps --all --no-trunc --filter name="${filter}$name\$" --format '{{.Status}}'\
|
|
| cut -f1 -d' ')"
|
|
|
|
# pass SDK related environment variables and gcloud auth
|
|
# into container
|
|
setup_sdk_env
|
|
setup_gsutil
|
|
|
|
mkdir -p "__build__/images"
|
|
mkdir -p "sdk_container/.cache/sdks"
|
|
|
|
hostname="${name:0:63}"
|
|
hostname="${hostname//./_}"
|
|
|
|
if [ -n "$cleanup" ] ; then
|
|
echo "$docker container rm -f '${name}'" >> "$cleanup"
|
|
fi
|
|
|
|
if [ -z "$stat" ] ; then
|
|
yell "Creating a new container '$name'"
|
|
|
|
gpg_volumes=$(gnupg_ssh_gcloud_mount_opts)
|
|
|
|
if [ -z "$custom_image" ]; then
|
|
(
|
|
source ci-automation/ci_automation_common.sh
|
|
docker_image_from_registry_or_buildcache "flatcar-sdk-${arch}" "${docker_sdk_vernum}"
|
|
)
|
|
fi
|
|
|
|
$docker create $tty -i \
|
|
-v /dev:/dev \
|
|
-v "$(pwd)/sdk_container:/mnt/host/source/" \
|
|
-v "$(pwd)/sdk_container/git-override/.git-coreos-overlay:/mnt/host/source/src/third_party/coreos-overlay/.git" \
|
|
-v "$(pwd)/sdk_container/git-override/.git-portage-stable:/mnt/host/source/src/third_party/portage-stable/.git" \
|
|
-v "$(pwd)/__build__/images:/mnt/host/source/src/build" \
|
|
-v "$(pwd):/mnt/host/source/src/scripts" \
|
|
$gpg_volumes \
|
|
--privileged \
|
|
--network host \
|
|
-e SDK_USER_ID="$(id -u)" \
|
|
-e SDK_GROUP_ID="$(id -g)" \
|
|
--name="$name" \
|
|
--hostname="$hostname" \
|
|
--entrypoint /bin/bash \
|
|
"${container_image_name}" -l
|
|
fi
|
|
|
|
if [ "$stat" != "Up" ] ; then
|
|
yell "Starting stopped container '$name'"
|
|
if [ "${remove}" = "true" ]; then
|
|
remove_command="$docker rm -f $name"
|
|
else
|
|
remove_command=":"
|
|
fi
|
|
trap "$docker stop -t 0 $name ; ${remove_command}" EXIT
|
|
$docker start "$name"
|
|
fi
|
|
|
|
# Workaround: The SDK expects to be able to write to /etc/hosts
|
|
$docker exec "$name" sh -c 'cp /etc/hosts /etc/hosts2; umount /etc/hosts ; mv /etc/hosts2 /etc/hosts'
|
|
|
|
$docker exec $tty -i "$name" /mnt/host/source/src/scripts/sdk_lib/sdk_entry.sh "$@"
|