From e6b4fdec1ac1114b1ec0c74ad5a452a7acd7cdae Mon Sep 17 00:00:00 2001 From: Slawek Koszewski Date: Sun, 21 Dec 2025 13:50:07 +0000 Subject: [PATCH] Fixed issues with setting up colored Bash prompt supporting displaying Git repository information. --- Dockerfile | 27 +++++-------------- azure-cli | 13 +++++++++- build | 12 +++------ enable-git-bash-prompt | 7 +++++ entrypoint.sh | 59 ++++++++++++++++++++++++++---------------- 5 files changed, 65 insertions(+), 53 deletions(-) create mode 100644 enable-git-bash-prompt diff --git a/Dockerfile b/Dockerfile index 2b5af66..3ddd8cf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,33 +22,18 @@ RUN apt-get update && apt-get install -y azure-cli RUN apt-get install -y zip unzip tree wget nano neovim \ python3 python3-venv python3-pip -# Configure Bash -RUN cat <<'EOF' >> /etc/profile.d/git-prompt-helper -# Include Git prompt helpers if available -if [ -f /usr/lib/git-core/git-sh-prompt ]; then - source /usr/lib/git-core/git-sh-prompt - - # Then PS1 can include __git_ps1 which is optimized and shows branch + state: - PS1='\[\e[32m\]AzureCLI (\[\e[35m\]${ACCOUNT_NAME}\[\e[0m\])\n\[\e[0m\]\[\e[34m\]\w\[\e[0m\]\[\e[33m\]$(__git_ps1 " (%s)")\[\e[0m\]\$ ' -fi - -export PATH=$HOME/bin:$PATH -EOF +COPY enable-git-bash-prompt /usr/local/bin/enable-git-bash-prompt +# Patch the default .bashrc to enable git bash prompt RUN cat <<'EOF' >> /etc/skel/.bashrc -if ! command -v __git_ps1 > /dev/null; then - source /etc/profile.d/git-prompt-helper -fi -EOF - -RUN cat <<'EOF' >> /home/ubuntu/.bashrc -if ! command -v __git_ps1 > /dev/null; then - source /etc/profile.d/git-prompt-helper +# Enable git bash prompt +if [ -f /usr/local/bin/enable-git-bash-prompt ]; then + source /usr/local/bin/enable-git-bash-prompt fi EOF COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] +ENTRYPOINT ["/entrypoint.sh"] diff --git a/azure-cli b/azure-cli index e697f14..e58db78 100755 --- a/azure-cli +++ b/azure-cli @@ -111,6 +111,16 @@ if [ ! "FOUND" = "$_FOUND" ]; then echo "Error: Failed to create volume $VOLUME_NAME." >&2 exit 1 fi + + # Volume created, initialize it + echo "Initializing volume $VOLUME_NAME." + if ! $CMD run --rm -it \ + --mount "type=volume,source=$VOLUME_NAME,target=/home/${USER_NAME}" \ + skoszewski/azure-cli:latest --user "$USER_NAME"; then + echo "Error: Failed to initialize volume $VOLUME_NAME." >&2 + exit 1 + fi + echo "Volume $VOLUME_NAME initialized successfully." fi EXTRA_ARGS+=( @@ -118,8 +128,9 @@ EXTRA_ARGS+=( "--mount" "type=bind,source=$(pwd),target=/workdir" "--env" "ACCOUNT_NAME=$ACCOUNT_NAME" "--name" "azure-cli-$VOLUME_NAME" + "--user" "$USER_NAME" "--workdir" "/workdir" ) -# Run the container +# Run the container as the specified user $CMD run --rm -it ${EXTRA_ARGS[@]} $IMAGE_NAME --user "$USER_NAME" "$@" diff --git a/build b/build index 0152167..056545b 100755 --- a/build +++ b/build @@ -1,17 +1,13 @@ #!/usr/bin/env bash # Find container runtime -if command -v podman &> /dev/null; then - CMD="podman" -elif command -v docker &> /dev/null; then - CMD="docker" +if command -v docker &> /dev/null; then + echo "Using Dokcer as container runtime." + docker buildx build -t skoszewski/azure-cli:latest . elif command -v container &> /dev/null; then # Apple container command line tool - CMD="container" + container build -t skoszewski/azure-cli:latest . else echo "Error: No usable container runtime was found." >&2 exit 1 fi - -echo "Using container runtime: $CMD" -$CMD build -t skoszewski/azure-cli:latest . diff --git a/enable-git-bash-prompt b/enable-git-bash-prompt new file mode 100644 index 0000000..3e9b26e --- /dev/null +++ b/enable-git-bash-prompt @@ -0,0 +1,7 @@ +# Include Git prompt helpers if available +if [ -f /usr/lib/git-core/git-sh-prompt ]; then + source /usr/lib/git-core/git-sh-prompt + + # Then PS1 can include __git_ps1 which is optimized and shows branch + state: + PS1='\[\e[32m\]AzureCLI (\[\e[35m\]${ACCOUNT_NAME}\[\e[0m\])\n\[\e[0m\]\[\e[34m\]\w\[\e[0m\]\[\e[33m\]$(__git_ps1 " (%s)")\[\e[0m\]\$ ' +fi diff --git a/entrypoint.sh b/entrypoint.sh index da4f12d..8a82c90 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,42 +2,55 @@ set -e -# Let's set some defaults -SU_USER="ubuntu" +# Setup default values +USER_NAME="ubuntu" -# Parse command line arguments +# Parse arguments while [ $# -gt 0 ]; do case "$1" in - -u|--user) - SU_USER="$2" + --user|-u) + USER_NAME="$2" shift 2 ;; + --) + # Stop parsing arguments + shift + break + ;; *) break ;; esac done -# Check if the user exists -if ! id -u "$SU_USER" >/dev/null 2>&1; then - useradd -m -s /usr/bin/bash "$SU_USER" +# Check, if we are running as root +if [ "$(id -u)" -eq 0 ]; then + # Check, if the home directory exists for the specified user + if [ ! -d "/home/${USER_NAME}" ]; then + echo "Error: Home directory for user '${USER_NAME}' does not exist." >&2 + exit 1 + fi + + # Check, ownership of the home directory + OWNER_UID=$(stat -c '%u' "/home/${USER_NAME}") + OWNER_GID=$(stat -c '%g' "/home/${USER_NAME}") + if [ "${OWNER_UID}" -ne 0 ] || [ "${OWNER_GID}" -ne 0 ]; then + # The home directory is not owned by the specfied user, correct it + chown "${USER_NAME}:${USER_NAME}" "/home/${USER_NAME}" + fi + + # Re-initialize the contents of the home directory + su - "${USER_NAME}" -c "cp -a /etc/skel/. /home/${USER_NAME}/" + + # We are done as root, quit. The container will be re-run as the specified user. + exit 0 fi -# Check if the home directory exists -if [ ! -d "/home/$SU_USER" ]; then - echo "A home directory for $SU_USER does not exist. Exiting." +# Verify that we are running as the user owning the home directory +if [ "$(id -un)" != "${USER_NAME}" ]; then + echo "Error: The script must be run as user '${USER_NAME}'." >&2 exit 1 fi -# Check user ownership of the home directory -if [ "$(stat -c '%u' /home/$SU_USER)" -ne "$(id -u $SU_USER)" ]; then - # Change ownership of the home directory - chown $SU_USER:$SU_USER /home/$SU_USER -fi - -# Switch to the specified user -if [ $# -gt 0 ]; then - exec su $SU_USER -c "$@" -else - exec su $SU_USER -fi +# Run shell +exec /usr/bin/bash "$@"