fix: various fixes
- Add uid and gid to dev user - Entry point script is mounted and not built in docker container - Change image name
This commit is contained in:
+41
-11
@@ -6,6 +6,9 @@ FROM ubuntu:${UBUNTU_VERSION}
|
|||||||
ARG OPENCODE_VERSION=1.18.32
|
ARG OPENCODE_VERSION=1.18.32
|
||||||
ARG NODE_VERSION=24.21.0
|
ARG NODE_VERSION=24.21.0
|
||||||
|
|
||||||
|
ARG DEV_UID=1000
|
||||||
|
ARG DEV_GID=1000
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive \
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
HOME=/home/dev \
|
HOME=/home/dev \
|
||||||
EDITOR=nvim \
|
EDITOR=nvim \
|
||||||
@@ -15,6 +18,7 @@ ENV DEBIAN_FRONTEND=noninteractive \
|
|||||||
|
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
|
# System packages
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get upgrade -y \
|
&& apt-get upgrade -y \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
@@ -48,28 +52,54 @@ RUN apt-get update \
|
|||||||
xz-utils \
|
xz-utils \
|
||||||
file \
|
file \
|
||||||
util-linux \
|
util-linux \
|
||||||
# && rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java \
|
&& update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java \
|
||||||
&& update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac \
|
&& 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 'en_US.UTF-8 UTF-8' > /etc/locale.gen \
|
||||||
&& locale-gen \
|
&& locale-gen
|
||||||
&& useradd --create-home --shell /bin/bash dev \
|
|
||||||
&& mkdir -p /workspace /home/dev/.config/opencode /home/dev/.local/share/opencode \
|
|
||||||
/home/dev/.cache/opencode /home/dev/.cache/pip /home/dev/.npm /home/dev/.m2 \
|
|
||||||
&& chown -R dev:dev /workspace /home/dev
|
|
||||||
|
|
||||||
RUN curl -fsSLO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \
|
# Runtime user
|
||||||
&& tar -xJf "node-v${NODE_VERSION}-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
|
RUN groupadd --gid 1001 dev \
|
||||||
&& rm "node-v${NODE_VERSION}-linux-x64.tar.xz" \
|
&& useradd \
|
||||||
|
--uid 1001 \
|
||||||
|
--gid 1001 \
|
||||||
|
--create-home \
|
||||||
|
--shell /bin/bash \
|
||||||
|
dev
|
||||||
|
|
||||||
|
# User directories
|
||||||
|
RUN mkdir -p \
|
||||||
|
/workspace \
|
||||||
|
/home/dev/.config/opencode \
|
||||||
|
/home/dev/.local/share/opencode \
|
||||||
|
/home/dev/.cache/opencode \
|
||||||
|
/home/dev/.cache/pip \
|
||||||
|
/home/dev/.npm \
|
||||||
|
/home/dev/.m2 \
|
||||||
|
&& chown -R dev:dev \
|
||||||
|
/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 \
|
&& node --version \
|
||||||
&& npm --version \
|
&& npm --version \
|
||||||
&& npm install --global "opencode-ai@${OPENCODE_VERSION}" \
|
&& npm install --global "opencode-ai@${OPENCODE_VERSION}" \
|
||||||
&& opencode --version \
|
&& opencode --version \
|
||||||
&& npm cache clean --force
|
&& npm cache clean --force
|
||||||
|
|
||||||
COPY entrypoint.sh /usr/local/bin/opencode-dev-entrypoint
|
# Runtime
|
||||||
RUN chmod +x /usr/local/bin/opencode-dev-entrypoint
|
USER dev
|
||||||
|
|
||||||
WORKDIR /workspace
|
WORKDIR /workspace
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/local/bin/opencode-dev-entrypoint"]
|
ENTRYPOINT ["/usr/local/bin/opencode-dev-entrypoint"]
|
||||||
|
|
||||||
CMD ["bash"]
|
CMD ["bash"]
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ OPENCODE_VERSION=$(curl -fsSI https://github.com/anomalyco/opencode/releases/lat
|
|||||||
NODE_VERSION=$(curl -fsSL https://nodejs.org/dist/index.json | sed -n 's/.*"version":"v\([^"]*\)".*"lts":".*".*/\1/p' | head -n 1)
|
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}"
|
IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}"
|
||||||
IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}"
|
# IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}"
|
||||||
IMAGE="${IMAGE_REPO}:${IMAGE_TAG}"
|
# IMAGE="${IMAGE_REPO}:${IMAGE_TAG}"
|
||||||
|
IMAGE="${IMAGE_REPO}"
|
||||||
|
|
||||||
NO_CACHE=()
|
NO_CACHE=()
|
||||||
if [[ "${1:-}" == "--no-cache" ]]; then
|
if [[ "${1:-}" == "--no-cache" ]]; then
|
||||||
@@ -40,12 +41,17 @@ if ((UPDATE)); then
|
|||||||
podman rmi $(podman images -q ${IMAGE_REPO})
|
podman rmi $(podman images -q ${IMAGE_REPO})
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
DEV_UID="$(id -u)"
|
||||||
|
DEV_GID="$(id -g)"
|
||||||
|
|
||||||
if [ ${DRY_RUN} == false ]; then
|
if [ ${DRY_RUN} == false ]; then
|
||||||
podman build \
|
podman build \
|
||||||
"${NO_CACHE[@]}" \
|
"${NO_CACHE[@]}" \
|
||||||
--build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" \
|
--build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" \
|
||||||
--build-arg "OPENCODE_VERSION=${OPENCODE_VERSION}" \
|
--build-arg "OPENCODE_VERSION=${OPENCODE_VERSION}" \
|
||||||
--build-arg "NODE_VERSION=${NODE_VERSION}" \
|
--build-arg "NODE_VERSION=${NODE_VERSION}" \
|
||||||
|
--build-arg "DEV_UID=${DEV_UID}" \
|
||||||
|
--build-arg "DEV_GID=${DEV_GID}" \
|
||||||
-t "$IMAGE" \
|
-t "$IMAGE" \
|
||||||
.
|
.
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR=$(realpath -- "$(dirname -- "${BASH_SOURCE[0]}")")
|
||||||
|
echo "Script dir: ${SCRIPT_DIR}"
|
||||||
|
|
||||||
BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/dev/opencode-dev}"
|
BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/dev/opencode-dev}"
|
||||||
PROJECTS_DIR="$BASE_DIR/projects"
|
PROJECTS_DIR="$BASE_DIR/projects"
|
||||||
IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}"
|
IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}"
|
||||||
OPENCODE_VERSION="${OPENCODE_VERSION:-1.18.32}"
|
# OPENCODE_VERSION="${OPENCODE_VERSION:-1.18.32}"
|
||||||
IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}"
|
# IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}"
|
||||||
IMAGE="${IMAGE_REPO}:${IMAGE_TAG}"
|
IMAGE="${IMAGE_REPO}"
|
||||||
|
|
||||||
mkdir -p \
|
mkdir -p \
|
||||||
"$BASE_DIR/opencode-config" \
|
"$BASE_DIR/opencode-config" \
|
||||||
@@ -19,6 +22,8 @@ mkdir -p \
|
|||||||
"$BASE_DIR/bash" \
|
"$BASE_DIR/bash" \
|
||||||
"$PROJECTS_DIR"
|
"$PROJECTS_DIR"
|
||||||
|
|
||||||
|
chown "$(id -u):$(id -g)" "$BASE_DIR/opencode-data"
|
||||||
|
|
||||||
if [[ ! -f "$HOME/.gitconfig" ]]; then
|
if [[ ! -f "$HOME/.gitconfig" ]]; then
|
||||||
echo "WARNING: $HOME/.gitconfig does not exist; Git will use container defaults." >&2
|
echo "WARNING: $HOME/.gitconfig does not exist; Git will use container defaults." >&2
|
||||||
fi
|
fi
|
||||||
@@ -51,6 +56,7 @@ fi
|
|||||||
ARGS=(
|
ARGS=(
|
||||||
run --rm -it
|
run --rm -it
|
||||||
--name opencode-dev
|
--name opencode-dev
|
||||||
|
--user dev
|
||||||
--userns=keep-id
|
--userns=keep-id
|
||||||
--security-opt=no-new-privileges
|
--security-opt=no-new-privileges
|
||||||
--network=default
|
--network=default
|
||||||
@@ -69,6 +75,7 @@ ARGS=(
|
|||||||
-v "$HOME/.gitconfig:/home/dev/.gitconfig:ro"
|
-v "$HOME/.gitconfig:/home/dev/.gitconfig:ro"
|
||||||
-v "$HOME/.ssh:/home/dev/.ssh:ro"
|
-v "$HOME/.ssh:/home/dev/.ssh:ro"
|
||||||
-v "$BASE_DIR/bash:/host-bash:ro"
|
-v "$BASE_DIR/bash:/host-bash:ro"
|
||||||
|
-v "$SCRIPT_DIR/entrypoint.sh:/usr/local/bin/opencode-dev-entrypoint:ro"
|
||||||
)
|
)
|
||||||
|
|
||||||
if [[ -n "${SSH_AUTH_SOCK:-}" && -S "$SSH_AUTH_SOCK" ]]; then
|
if [[ -n "${SSH_AUTH_SOCK:-}" && -S "$SSH_AUTH_SOCK" ]]; then
|
||||||
@@ -100,4 +107,6 @@ if [[ -f "$BASH_RC" ]]; then
|
|||||||
ARGS+=(-e BASH_ENV=/host-bash/bashrc)
|
ARGS+=(-e BASH_ENV=/host-bash/bashrc)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "Calling with args: ${ARGS[@]}"
|
||||||
|
|
||||||
exec podman "${ARGS[@]}" "$IMAGE" bash
|
exec podman "${ARGS[@]}" "$IMAGE" bash
|
||||||
|
|||||||
+3
-1
@@ -51,4 +51,6 @@ fi
|
|||||||
|
|
||||||
# The image entrypoint is root only for one-time runtime setup; the shell/OpenCode
|
# The image entrypoint is root only for one-time runtime setup; the shell/OpenCode
|
||||||
# process itself always runs as the unprivileged dev user.
|
# process itself always runs as the unprivileged dev user.
|
||||||
exec su -s /bin/bash dev -c 'cd "${START_DIR:-/workspace}" && exec "$@"' -- "$@"
|
# exec su -s /bin/bash dev -c 'cd "${START_DIR:-/workspace}" && exec "$@"' -- "$@"
|
||||||
|
cd "${START_DIR:-/workspace}"
|
||||||
|
exec "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user