From bec394705817b7cb0718a5d76f33e6937ee7bb20 Mon Sep 17 00:00:00 2001 From: BadPirate Date: Fri, 18 Apr 2025 16:48:07 -0700 Subject: [PATCH] Fix #371 Allow multiple containers on same machine (#373) - Docker container name based on work directory - Centralize container removal logic - Improve quoting for command arguments - Ensure workdir is always set and normalized Resolves: #371 Signed-off-by: BadPirate Signed-off-by: BadPirate --- codex-cli/scripts/run_in_container.sh | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/codex-cli/scripts/run_in_container.sh b/codex-cli/scripts/run_in_container.sh index 2e6978be..c95c57ae 100755 --- a/codex-cli/scripts/run_in_container.sh +++ b/codex-cli/scripts/run_in_container.sh @@ -23,6 +23,16 @@ fi WORK_DIR=$(realpath "$WORK_DIR") +# Generate a unique container name based on the normalized work directory +CONTAINER_NAME="codex_$(echo "$WORK_DIR" | sed 's/\//_/g' | sed 's/[^a-zA-Z0-9_-]//g')" + +# Define cleanup to remove the container on script exit, ensuring no leftover containers +cleanup() { + docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true +} +# Trap EXIT to invoke cleanup regardless of how the script terminates +trap cleanup EXIT + # Ensure a command is provided. if [ "$#" -eq 0 ]; then echo "Usage: $0 [--work_dir directory] \"COMMAND\"" @@ -35,11 +45,11 @@ if [ -z "$WORK_DIR" ]; then exit 1 fi -# Remove any existing container named 'codex'. -docker rm -f codex 2>/dev/null || true +# Kill any existing container for the working directory using cleanup(), centralizing removal logic. +cleanup # Run the container with the specified directory mounted at the same path inside the container. -docker run --name codex -d \ +docker run --name "$CONTAINER_NAME" -d \ -e OPENAI_API_KEY \ --cap-add=NET_ADMIN \ --cap-add=NET_RAW \ @@ -48,7 +58,7 @@ docker run --name codex -d \ sleep infinity # Initialize the firewall inside the container. -docker exec codex bash -c "sudo /usr/local/bin/init_firewall.sh" +docker exec "$CONTAINER_NAME" bash -c "sudo /usr/local/bin/init_firewall.sh" # Execute the provided command in the container, ensuring it runs in the work directory. # We use a parameterized bash command to safely handle the command and directory. @@ -57,4 +67,4 @@ quoted_args="" for arg in "$@"; do quoted_args+=" $(printf '%q' "$arg")" done -docker exec -it codex bash -c "cd \"/app$WORK_DIR\" && codex --full-auto ${quoted_args}" +docker exec -it "$CONTAINER_NAME" bash -c "cd \"/app$WORK_DIR\" && codex --full-auto ${quoted_args}"