Compare commits
7 Commits
c83a4f115a
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 68f0d2efc9 | |||
| e6b4fdec1a | |||
| b908f3f1f0 | |||
|
|
4de8cc79f2 | ||
| 1cbbe22dc1 | |||
| 42c2dd933c | |||
|
|
b90a6a0746 |
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"/build": "shellscript",
|
||||
"/azure-cli": "shellscript"
|
||||
"./build": "shellscript",
|
||||
"./azure-cli": "shellscript",
|
||||
"./link-to-bin": "shellscript",
|
||||
"./entrypoint.sh": "shellscript"
|
||||
}
|
||||
}
|
||||
21
Dockerfile
21
Dockerfile
@@ -22,27 +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
|
||||
# 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"]
|
||||
|
||||
29
azure-cli
29
azure-cli
@@ -2,11 +2,13 @@
|
||||
|
||||
# Set default values
|
||||
ACCOUNT_NAME="$(id -un)"
|
||||
USER_NAME="ubuntu"
|
||||
USER_NAME="${USER_NAME:-ubuntu}"
|
||||
EXTRA_ARGS=()
|
||||
LIST=""
|
||||
VOLUME_NAME=""
|
||||
HOME_DIR="/home/${USER_NAME}"
|
||||
|
||||
# Parse command line arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
--list|-l)
|
||||
@@ -30,6 +32,11 @@ while [ $# -gt 0 ]; do
|
||||
EXTRA_ARGS+=("--mount" "type=bind,source=${VOL_SRC},target=${VOL_DST}")
|
||||
shift 2
|
||||
;;
|
||||
--root)
|
||||
USER_NAME="root"
|
||||
HOME_DIR="/root"
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
# Stop parsing arguments
|
||||
shift
|
||||
@@ -111,15 +118,31 @@ 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_DIR" $IMAGE_NAME; then
|
||||
echo "Error: Failed to initialize volume $VOLUME_NAME." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Volume $VOLUME_NAME initialized successfully."
|
||||
fi
|
||||
|
||||
EXTRA_ARGS+=(
|
||||
"--mount" "type=volume,source=$VOLUME_NAME,target=/home/${USER_NAME}"
|
||||
"--mount" "type=bind,source=$(pwd),target=/workdir"
|
||||
"--env" "ACCOUNT_NAME=$ACCOUNT_NAME"
|
||||
"--env" "USER_NAME=$USER_NAME"
|
||||
"--env" "HOME_DIR=$HOME_DIR"
|
||||
"--name" "azure-cli-$VOLUME_NAME"
|
||||
"--workdir" "/workdir"
|
||||
)
|
||||
|
||||
# Run the container
|
||||
$CMD run --rm -it ${EXTRA_ARGS[@]} $IMAGE_NAME --user "$USER_NAME" "$@"
|
||||
if [ "$USER_NAME" != "root" ]; then
|
||||
EXTRA_ARGS+=(
|
||||
"--user" "$USER_NAME"
|
||||
)
|
||||
fi
|
||||
|
||||
# Run the container as the specified user
|
||||
$CMD run --rm -it ${EXTRA_ARGS[@]} $IMAGE_NAME "$@"
|
||||
|
||||
12
build
12
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 .
|
||||
|
||||
7
enable-git-bash-prompt
Normal file
7
enable-git-bash-prompt
Normal file
@@ -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
|
||||
@@ -2,42 +2,41 @@
|
||||
|
||||
set -e
|
||||
|
||||
# Let's set some defaults
|
||||
SU_USER="ubuntu"
|
||||
# Setup default values
|
||||
USER_NAME="${USER_NAME:-ubuntu}"
|
||||
HOME_DIR="${HOMED_DIR:-/home/${USER_NAME}}"
|
||||
|
||||
# Parse command line arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-u|--user)
|
||||
SU_USER="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# 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_DIR" ]; then
|
||||
echo "Error: Home directory for user '${USER_NAME}' does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user exists
|
||||
if ! id -u "$SU_USER" >/dev/null 2>&1; then
|
||||
useradd -m -s /usr/bin/bash "$SU_USER"
|
||||
echo "Preparing home directory for user '${USER_NAME}' at '${HOME_DIR}'."
|
||||
|
||||
# Check, ownership of the home directory
|
||||
if [ "$(stat -c '%u' "$HOME_DIR")" -eq 0 ]; then
|
||||
# The home directory is a fresh volume owned by root, change ownership
|
||||
echo "Changing ownership of home directory to user '${USER_NAME}'."
|
||||
chown "${USER_NAME}:${USER_NAME}" "$HOME_DIR"
|
||||
fi
|
||||
|
||||
if [ "$USER_NAME " != "root" ]; then
|
||||
# Re-initialize the contents of the home directory
|
||||
su - "${USER_NAME}" -c "cp -a /etc/skel/. $HOME_DIR"
|
||||
|
||||
# We are done as root, quit. The container will be re-run as the specified user.
|
||||
exit 0
|
||||
fi
|
||||
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 "$@"
|
||||
|
||||
17
link-to-bin
Executable file
17
link-to-bin
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/bash
|
||||
#
|
||||
# Make a symbolic link from the 'azure-cli' executable script
|
||||
# to $HOME/bin.
|
||||
#
|
||||
|
||||
if [ ! -d "$HOME/bin" ]; then
|
||||
mkdir -p "$HOME/bin"
|
||||
cat <<'EOF' >> $HOME/.bashrc
|
||||
|
||||
# Add $HOME/bin to the PATH variable
|
||||
export PATH=$HOME/bin:$PATH
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Make a link
|
||||
ln -s "$(cd $(dirname ${BASH_SOURCE[0]}); pwd)/azure-cli" "$HOME/bin/azure-cli"
|
||||
Reference in New Issue
Block a user