Files
clice/docker/linux/run.sh
sora-mono f94927dc1d Dev Container Support (#248)
Co-authored-by: star9029 <hengxings783@gmail.com>
2025-09-19 23:28:36 +08:00

88 lines
2.6 KiB
Bash

#!/bin/bash
set -e
# Save original working directory and switch to project root
ORIG_PWD="$(pwd)"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "${SCRIPT_DIR}"
cd "${SCRIPT_DIR}/../.."
PROJECT_ROOT="$(pwd)"
trap 'cd "${ORIG_PWD}"' EXIT
# default configurations
COMPILER="clang"
RESET="false"
usage() {
cat <<EOF
Usage: $0 [--compiler <gcc|clang>] [--reset]
Defaults:
--compiler ${COMPILER}
--reset (re-create the container)
EOF
}
# parse command line arguments
while [ "$#" -gt 0 ]; do
case "$1" in
--compiler)
COMPILER="$2"; shift 2;;
--reset)
RESET="true"; shift 1;;
-h|--help)
usage; exit 0;;
*) echo "Unknown parameter: $1"; usage; exit 1;;
esac
done
IMAGE_TAG="linux-${COMPILER}"
IMAGE_NAME="clice-io/clice-dev:${IMAGE_TAG}"
CONTAINER_NAME="clice-dev-linux-${COMPILER}"
# If the image doesn't exist, build it automatically by invoking build.sh
if ! docker image inspect "${IMAGE_NAME}" >/dev/null 2>&1; then
echo "Image ${IMAGE_NAME} not found, invoking build.sh to create it..."
./docker/linux/build.sh --compiler "${COMPILER}"
fi
# Handle --reset: remove the existing container if it exists
if [ "${RESET}" = "true" ]; then
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "Resetting container: stopping and removing existing container ${CONTAINER_NAME}..."
docker stop "${CONTAINER_NAME}" >/dev/null 2>&1 || true
docker rm "${CONTAINER_NAME}" >/dev/null 2>&1
echo "Container ${CONTAINER_NAME} has been removed."
else
echo "Container ${CONTAINER_NAME} does not exist, no need to reset."
fi
exit 0
fi
CONTAINER_WORKDIR="/clice"
# Check if the container exists
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "==========================================="
echo "Attaching to existing container: ${CONTAINER_NAME}"
echo "From image: ${IMAGE_NAME}"
echo "Project mount: ${PROJECT_ROOT} -> ${CONTAINER_WORKDIR}"
echo "==========================================="
docker start "${CONTAINER_NAME}" >/dev/null
docker exec -it -w "${CONTAINER_WORKDIR}" "${CONTAINER_NAME}" /bin/bash
exit 0
fi
DOCKER_RUN_ARGS=(-it -w "${CONTAINER_WORKDIR}")
DOCKER_RUN_ARGS+=(--name "${CONTAINER_NAME}")
DOCKER_RUN_ARGS+=(--mount "type=bind,src=${PROJECT_ROOT},target=${CONTAINER_WORKDIR}")
echo "==========================================="
echo "Creating and running new container: ${CONTAINER_NAME}"
echo "From image: ${IMAGE_NAME}"
echo "Project mount: ${PROJECT_ROOT} -> ${CONTAINER_WORKDIR}"
echo "==========================================="
docker run "${DOCKER_RUN_ARGS[@]}" "${IMAGE_NAME}"