# Base image with Docker-in-Docker capability FROM docker:28.1.1-cli # Metadata LABEL maintainer="edward.coderman@mythicdevelopment.com" # Install core utilities RUN apk add --no-cache \ bash \ curl \ git \ build-base \ openssl \ openssl-dev \ libffi-dev \ linux-headers \ ncurses \ ncurses-dev \ readline \ zlib-dev \ bzip2-dev \ xz-dev \ sqlite-dev \ wget \ ca-certificates \ sudo \ coreutils \ tini # Install pyenv (optional, if you want flexible Python version management) ENV PYENV_ROOT /root/.pyenv ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:/usr/bin/coreutils:${PYENV_ROOT}/bin:$PATH RUN curl https://pyenv.run | bash && \ pyenv install 3.12 && \ pyenv global 3.12 # Upgrade pip + install pyinstaller RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir pyinstaller # Install uv (https://github.com/astral-sh/uv) RUN curl -Ls https://astral.sh/uv/install.sh | bash # Install node # Use bash for the shell SHELL ["/bin/bash", "-o", "pipefail", "-c"] # Environment for bash + NVM ENV NVM_DIR /app/.nvm ENV BASH_ENV /app/.bash_env # Setup shell sourcing RUN mkdir -p "$NVM_DIR" && touch "$BASH_ENV" && \ echo "export NVM_DIR=$NVM_DIR" >> "$BASH_ENV" && \ echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> "$BASH_ENV" # Install NVM and desired Node version RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | PROFILE="$BASH_ENV" bash RUN bash -c "source $BASH_ENV && nvm install 20 && nvm alias default 20 && nvm use default" RUN echo 'export PYENV_ROOT="/root/.pyenv"' >> $BASH_ENV && \ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> $BASH_ENV && \ echo 'if [ -n "$PS1" ]; then' >> "$BASH_ENV" && \ echo ' eval "$(pyenv init --path)"' >> "$BASH_ENV" && \ echo ' eval "$(pyenv init -)"' >> "$BASH_ENV" && \ echo 'fi' >> "$BASH_ENV" && \ echo '. "${BASH_ENV}"' >> ~/.bashrc RUN bash -c "source $BASH_ENV && nvm use default && \ ln -sf $(command -v node) /usr/local/bin/node && \ ln -sf $(command -v npm) /usr/local/bin/npm && \ ln -sf $(command -v npx) /usr/local/bin/npx && \ ln -sf /root/.local/bin/uv /usr/local/bin/uv" ENTRYPOINT ["/sbin/tini", "--"] CMD ["bash", "-l"]