diff --git a/rust/.devcontainer/Dockerfile b/rust/.devcontainer/Dockerfile new file mode 100644 index 0000000..76f3940 --- /dev/null +++ b/rust/.devcontainer/Dockerfile @@ -0,0 +1,36 @@ +FROM rust:1.90.0 + +# Install basic development tools +RUN apt-get update && apt-get install -y \ + build-essential \ + gdb \ + git \ + procps \ + sudo \ + && rm -rf /var/lib/apt/lists/* + +# Create developer user with host UID/GID +ARG USER_UID=1000 +ARG USER_GID=1000 +ENV USER_UID=${USER_UID:-1000} +ENV USER_GID=${USER_GID:-1000} +RUN groupadd -g $USER_GID developer \ + && useradd -u $USER_UID -g $USER_GID -m developer \ + && mkdir -p /workspace \ + && chown developer:developer /workspace + +RUN echo 'developer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/developer \ + && chmod 0440 /etc/sudoers.d/developer + +RUN mkdir -p /home/developer/.vscode-server \ + && chown -R developer:developer /home/developer/.vscode-server + +# Switch to developer user +USER developer + + +# Set up cargo path +ENV PATH="/home/developer/.cargo/bin:${PATH}" + +# Set default workspace directory +WORKDIR /workspace \ No newline at end of file diff --git a/rust/.devcontainer/devcontainer.json b/rust/.devcontainer/devcontainer.json new file mode 100644 index 0000000..46c7237 --- /dev/null +++ b/rust/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "Rust Development", + "build": { + "dockerfile": "Dockerfile", + "args": { + "USER_UID": "${localEnv:UID:1000}", + "USER_GID": "${localEnv:GID:1000}" + } + }, + "remoteUser": "developer", + "customizations": { + "vscode": { + "extensions": [ + "rust-lang.rust-analyzer", + "fill-labs.dependi", + "vadimcn.vscode-lldb" + ], + "settings": { + "rust-analyzer.checkOnSave": true + } + } + }, + "runArgs": [ + "--name", + "${localEnv:USER}-${localWorkspaceFolderBasename}-rust-dev", + "--mount", + "type=volume,source=vscode-extensions,target=/home/developer/.vscode-server/extensions" + ], + "postStartCommand": "sudo chown -R $(id -u):$(id -g) ~/.vscode-server || true", + "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind", + "workspaceFolder": "/workspace" +} \ No newline at end of file