diff --git a/Dockerfile b/Dockerfile index 2938da4..ba66119 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,19 +3,16 @@ ARG UBUNTU_VERSION=26.04 FROM ubuntu:${UBUNTU_VERSION} -ARG OPENCODE_VERSION=1.18.32 ARG NODE_VERSION=24.21.0 ARG DEV_UID=1000 ARG DEV_GID=1000 -ENV DEBIAN_FRONTEND=noninteractive \ - HOME=/home/dev \ - EDITOR=nvim \ - VISUAL=nvim \ - PIP_CACHE_DIR=/home/dev/.cache/pip \ - NPM_CONFIG_CACHE=/home/dev/.npm +# Move the pre-existing ubuntu user/group away from 1000:1000 +RUN groupmod --gid 1234 ubuntu \ + && usermod --uid 1234 --gid 1234 ubuntu +ENV DEBIAN_FRONTEND=noninteractive SHELL ["/bin/bash", "-o", "pipefail", "-c"] # System packages @@ -56,17 +53,32 @@ RUN apt-get update \ && update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac \ # && rm -rf /var/lib/apt/lists/* && echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen \ + && echo 'root:admin' | chpasswd \ && locale-gen # Runtime user -RUN groupadd --gid 1001 dev \ +RUN groupadd --gid "${DEV_GID}" dev \ && useradd \ - --uid 1001 \ - --gid 1001 \ + --uid "${DEV_UID}" \ + --gid "${DEV_GID}" \ --create-home \ --shell /bin/bash \ dev +# Node.js + OpenCode +RUN curl -fsSLO \ + "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \ + && tar -xJf \ + "node-v${NODE_VERSION}-linux-x64.tar.xz" \ + -C /usr/local \ + --strip-components=1 \ + && rm "node-v${NODE_VERSION}-linux-x64.tar.xz" \ + && echo -n "node version: " && node --version \ + && echo -n "npm version: " && npm --version \ + && npm install -g @opencode/cli \ + && echo -n "opencode version: " && opencode --version \ + && npm cache clean --force + # User directories RUN mkdir -p \ /workspace \ @@ -80,24 +92,19 @@ RUN mkdir -p \ /workspace \ /home/dev -# Node.js + OpenCode -RUN curl -fsSLO \ - "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \ - && tar -xJf \ - "node-v${NODE_VERSION}-linux-x64.tar.xz" \ - -C /usr/local \ - --strip-components=1 \ - && rm \ - "node-v${NODE_VERSION}-linux-x64.tar.xz" \ - && node --version \ - && npm --version \ - && npm install --global "opencode-ai@${OPENCODE_VERSION}" \ - && opencode --version \ - && npm cache clean --force +RUN printf '%s\n' 'shopt -s dotglob' >> /etc/bash.bashrc # Runtime USER dev +ENV HOME=/home/dev \ + EDITOR=nvim \ + VISUAL=nvim \ + PIP_CACHE_DIR=/home/dev/.cache/pip \ + NPM_CONFIG_CACHE=/home/dev/.npm + +RUN echo 'for f in /host-bash/*; do [ -r "$f" ] && source "$f"; done' >> ~/.bashrc + WORKDIR /workspace ENTRYPOINT ["/usr/local/bin/opencode-dev-entrypoint"] diff --git a/build.sh b/build.sh index ad77539..63c3adf 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" UBUNTU_VERSION="${UBUNTU_VERSION:-26.04}" -OPENCODE_VERSION=$(curl -fsSI https://github.com/anomalyco/opencode/releases/latest | sed -n 's/^location:.*\/tag\/v\{0,1\}\(.*\)\r$/\1/ip') +# OPENCODE_VERSION=$(curl -fsSI https://github.com/anomalyco/opencode/releases/latest | sed -n 's/^location:.*\/tag\/v\{0,1\}\(.*\)\r$/\1/ip') NODE_VERSION=$(curl -fsSL https://nodejs.org/dist/index.json | sed -n 's/.*"version":"v\([^"]*\)".*"lts":".*".*/\1/p' | head -n 1) IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}" @@ -48,7 +48,6 @@ if [ ${DRY_RUN} == false ]; then podman build \ "${NO_CACHE[@]}" \ --build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" \ - --build-arg "OPENCODE_VERSION=${OPENCODE_VERSION}" \ --build-arg "NODE_VERSION=${NODE_VERSION}" \ --build-arg "DEV_UID=${DEV_UID}" \ --build-arg "DEV_GID=${DEV_GID}" \ @@ -58,5 +57,5 @@ if [ ${DRY_RUN} == false ]; then echo echo "Built: $IMAGE" else - echo "running: podman build ${NO_CACHE[@]} --build-arg UBUNTU_VERSION=${UBUNTU_VERSION} --build-arg OPENCODE_VERSION=${OPENCODE_VERSION} --build-arg NODE_VERSION=${NODE_VERSION} -t $IMAGE" + echo "running: podman build ${NO_CACHE[@]} --build-arg UBUNTU_VERSION=${UBUNTU_VERSION} --build-arg NODE_VERSION=${NODE_VERSION} -t $IMAGE" fi diff --git a/dev.sh b/dev.sh index e838b77..1a13c40 100755 --- a/dev.sh +++ b/dev.sh @@ -5,24 +5,35 @@ SCRIPT_DIR=$(realpath -- "$(dirname -- "${BASH_SOURCE[0]}")") echo "Script dir: ${SCRIPT_DIR}" BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/opencode-dev}" -PROJECTS_DIR="$BASE_DIR/projects" IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}" # OPENCODE_VERSION="${OPENCODE_VERSION:-1.18.32}" # IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}" IMAGE="${IMAGE_REPO}" -mkdir -p \ - "$BASE_DIR/opencode-config" \ - "$BASE_DIR/opencode-data" \ - "$BASE_DIR/opencode-cache" \ - "$BASE_DIR/m2" \ - "$BASE_DIR/npm-cache" \ - "$BASE_DIR/pip-cache" \ - "$BASE_DIR/certs" \ - "$BASE_DIR/bash" \ - "$PROJECTS_DIR" +# Folders +PROJECTS_DIR="${PROJECT_DIR:-$BASE_DIR/projects}" +OPC_CONFIG="${OPENCODE_CONFIG:-$BASE_DIR/opencode-config}" +OPC_DATA="${OPENCODE_SHARE_DATA:-$BASE_DIR/opencode-data}" +OPC_CACHE="${OPENCODE_CACHE:-$BASE_DIR/opencode-cache}" +M2_FOLDER="${M2_FOLDER:-$BASE_DIR/m2}" +NPM_CACHE="${NPM_CACHE:-$BASE_DIR/npm-cache}" +PIP_CACHE="${PIP_CACHE:-$BASE_DIR/pip-cache}" +CERTIFICATES="${CERTIFICATES:-$BASE_DIR/certs}" +BASH_FOLDER="${BASH_FOLDER:-$BASE_DIR/bash}" -chmod -R 777 "$BASE_DIR" +mkdir -p \ + "$BASE_DIR" \ + "$PROJECTS_DIR" \ + "$OPC_CONFIG" \ + "$OPC_DATA" \ + "$OPC_CACHE" \ + "$M2_FOLDER" \ + "$NPM_CACHE" \ + "$PIP_CACHE" \ + "$CERTIFICATES" \ + "$BASH_FOLDER" + +# chmod -R 777 "$BASE_DIR" if [[ ! -f "$HOME/.gitconfig" ]]; then echo "WARNING: $HOME/.gitconfig does not exist; Git will use container defaults." >&2 @@ -64,17 +75,18 @@ ARGS=( -e "HOST_LANG=${LANG:-C.UTF-8}" -e "HOST_LC_ALL=${LC_ALL:-}" -e "START_DIR=${START_DIR}" - -v "$BASE_DIR/opencode-config:/home/dev/.config/opencode:rw" - -v "$BASE_DIR/opencode-data:/home/dev/.local/share/opencode:rw" - -v "$BASE_DIR/opencode-cache:/home/dev/.cache/opencode:rw" - -v "$BASE_DIR/m2:/home/dev/.m2:rw" - -v "$BASE_DIR/npm-cache:/home/dev/.npm:rw" - -v "$BASE_DIR/pip-cache:/home/dev/.cache/pip:rw" - -v "$BASE_DIR/certs:/host-certs:ro" + + -v "$OPC_CONFIG:/home/dev/.config/opencode:rw" + -v "$OPC_DATA:/home/dev/.local/share/opencode:rw" + -v "$OPC_CACHE:/home/dev/.cache/opencode:rw" + -v "$M2_FOLDER:/home/dev/.m2:rw" + -v "$NPM_CACHE:/home/dev/.npm:rw" + -v "$PIP_CACHE:/home/dev/.cache/pip:rw" + -v "$CERTIFICATES:/host-certs:ro" -v "$PROJECTS_DIR:/workspace:rw" -v "$HOME/.gitconfig:/home/dev/.gitconfig:ro" -v "$HOME/.ssh:/home/dev/.ssh:ro" - -v "$BASE_DIR/bash:/host-bash:ro" + -v "$BASH_FOLDER:/host-bash:ro" -v "$SCRIPT_DIR/entrypoint.sh:/usr/local/bin/opencode-dev-entrypoint:ro" )