115 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Docker
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Docker
		
	
	
	
	
	
| FROM ubuntu:24.04
 | |
| 
 | |
| ARG USER_ID=1000
 | |
| ARG GROUP_ID=1000
 | |
| ARG USERNAME=toolbox
 | |
| ARG TEA_VERSION=0.11.1
 | |
| 
 | |
| ENV DEBIAN_FRONTEND=noninteractive
 | |
| 
 | |
| RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
 | |
|     --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
 | |
|     apt-get update \
 | |
|     && apt-get install -y --no-install-recommends \
 | |
|         ca-certificates \
 | |
|         curl \
 | |
|         fish \
 | |
|         fzf \
 | |
|         git \
 | |
|         jq \
 | |
|         bc \
 | |
|         locales \
 | |
|         openssh-client \
 | |
|         ripgrep \
 | |
|         tmux \
 | |
|         screen \
 | |
|         fd-find \
 | |
|         bat \
 | |
|         httpie \
 | |
|         build-essential \
 | |
|         pkg-config \
 | |
|         libssl-dev \
 | |
|         zlib1g-dev \
 | |
|         libffi-dev \
 | |
|         libsqlite3-dev \
 | |
|         libreadline-dev \
 | |
|         wget \
 | |
|         zsh \
 | |
|     && apt-get clean \
 | |
|     && rm -rf /var/lib/apt/lists/*
 | |
| 
 | |
| # Provide common aliases for fd and bat binaries
 | |
| RUN ln -sf /usr/bin/fdfind /usr/local/bin/fd \
 | |
|     && ln -sf /usr/bin/batcat /usr/local/bin/bat
 | |
| 
 | |
| # Install Gitea tea CLI
 | |
| RUN curl -fsSL "https://dl.gitea.io/tea/${TEA_VERSION}/tea-${TEA_VERSION}-linux-amd64" -o /tmp/tea \
 | |
|     && curl -fsSL "https://dl.gitea.io/tea/${TEA_VERSION}/tea-${TEA_VERSION}-linux-amd64.sha256" -o /tmp/tea.sha256 \
 | |
|     && sed -n 's/ .*//p' /tmp/tea.sha256 | awk '{print $1 "  /tmp/tea"}' | sha256sum -c - \
 | |
|     && install -m 0755 /tmp/tea /usr/local/bin/tea \
 | |
|     && rm -f /tmp/tea /tmp/tea.sha256
 | |
| 
 | |
| # Configure locale to ensure consistent tool behavior
 | |
| RUN locale-gen en_US.UTF-8
 | |
| ENV LANG=en_US.UTF-8 \
 | |
|     LANGUAGE=en_US:en \
 | |
|     LC_ALL=en_US.UTF-8
 | |
| 
 | |
| # Install Starship prompt
 | |
| RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b /usr/local/bin
 | |
| 
 | |
| # Install aqua package manager (manages additional CLI tooling)
 | |
| RUN curl -sSfL https://raw.githubusercontent.com/aquaproj/aqua-installer/v2.3.1/aqua-installer | AQUA_ROOT_DIR=/usr/local/share/aquaproj-aqua bash \
 | |
|     && ln -sf /usr/local/share/aquaproj-aqua/bin/aqua /usr/local/bin/aqua
 | |
| 
 | |
| # Install mise for runtime management (no global toolchains pre-installed)
 | |
| RUN curl -sSfL https://mise.jdx.dev/install.sh | env MISE_INSTALL_PATH=/usr/local/bin/mise MISE_INSTALL_HELP=0 sh
 | |
| 
 | |
| # Create non-root user with matching UID/GID for host mapping
 | |
| RUN if getent passwd "${USER_ID}" >/dev/null; then \
 | |
|         existing_user="$(getent passwd "${USER_ID}" | cut -d: -f1)"; \
 | |
|         userdel --remove "${existing_user}"; \
 | |
|     fi \
 | |
|     && if ! getent group "${GROUP_ID}" >/dev/null; then \
 | |
|         groupadd --gid "${GROUP_ID}" "${USERNAME}"; \
 | |
|     fi \
 | |
|     && useradd --uid "${USER_ID}" --gid "${GROUP_ID}" --shell /usr/bin/zsh --create-home "${USERNAME}"
 | |
| 
 | |
| # Install Oh My Zsh and configure shells for the unprivileged user
 | |
| RUN su - "${USERNAME}" -c 'git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh' \
 | |
|     && su - "${USERNAME}" -c 'cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'mkdir -p ~/.config' \
 | |
|     && su - "${USERNAME}" -c 'sed -i "s/^plugins=(git)$/plugins=(git fzf)/" ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\nexport PATH=\"\$HOME/.local/share/aquaproj-aqua/bin:\$HOME/.local/share/mise/shims:\$HOME/.local/bin:\$PATH\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\nexport AQUA_GLOBAL_CONFIG=\"\$HOME/.config/aquaproj-aqua/aqua.yaml\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# Starship prompt\neval \"\$(starship init zsh)\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# mise runtime manager\neval \"\$(mise activate zsh)\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# direnv\nexport DIRENV_LOG_FORMAT=\"\"\neval \"\$(direnv hook zsh)\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# zoxide\neval \"\$(zoxide init zsh)\"\n" >> ~/.zshrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\nexport AQUA_GLOBAL_CONFIG=\"\$HOME/.config/aquaproj-aqua/aqua.yaml\"\n" >> ~/.bashrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# mise runtime manager (bash)\neval \"\$(mise activate bash)\"\n" >> ~/.bashrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# direnv\nexport DIRENV_LOG_FORMAT=\"\"\neval \"\$(direnv hook bash)\"\n" >> ~/.bashrc' \
 | |
|     && su - "${USERNAME}" -c 'printf "\n# zoxide\neval \"\$(zoxide init bash)\"\n" >> ~/.bashrc' \
 | |
|     && su - "${USERNAME}" -c 'mkdir -p ~/.config/fish' \
 | |
|     && su - "${USERNAME}" -c 'printf "\nset -gx AQUA_GLOBAL_CONFIG \$HOME/.config/aquaproj-aqua/aqua.yaml\n# Shell prompt and runtime manager\nstarship init fish | source\nmise activate fish | source\ndirenv hook fish | source\nzoxide init fish | source\n" >> ~/.config/fish/config.fish'
 | |
| 
 | |
| COPY aqua.yaml /tmp/aqua.yaml
 | |
| 
 | |
| RUN chown "${USER_ID}:${GROUP_ID}" /tmp/aqua.yaml \
 | |
|     && su - "${USERNAME}" -c 'mkdir -p ~/.config/aquaproj-aqua' \
 | |
|     && su - "${USERNAME}" -c 'cp /tmp/aqua.yaml ~/.config/aquaproj-aqua/aqua.yaml' \
 | |
|     && su - "${USERNAME}" -c 'AQUA_GLOBAL_CONFIG=~/.config/aquaproj-aqua/aqua.yaml aqua install'
 | |
| 
 | |
| # Prepare workspace directory with appropriate ownership
 | |
| RUN mkdir -p /workspace \
 | |
|     && chown "${USER_ID}:${GROUP_ID}" /workspace
 | |
| 
 | |
| ENV SHELL=/usr/bin/zsh \
 | |
|     AQUA_GLOBAL_CONFIG=/home/${USERNAME}/.config/aquaproj-aqua/aqua.yaml \
 | |
|     PATH=/home/${USERNAME}/.local/share/aquaproj-aqua/bin:/home/${USERNAME}/.local/share/mise/shims:/home/${USERNAME}/.local/bin:${PATH}
 | |
| 
 | |
| WORKDIR /workspace
 | |
| USER ${USERNAME}
 | |
| 
 | |
| CMD ["/usr/bin/zsh"]
 |