diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 17e7ed2..b7b99ad 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,40 +1,32 @@ # DevContainer image -FROM ubuntu:24.04 +FROM nvidia/cuda:12.6.1-cudnn-runtime-ubuntu24.04 + RUN \ # install docker apt-get update && \ - apt-get install ca-certificates curl -y && \ + apt-get install ca-certificates curl gnupg lsb-release -y && \ mkdir -m 0755 -p /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \ - chmod a+r /etc/apt/keyrings/docker.asc && \ - echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ - tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ apt-get update && \ apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y && \ - usermod -aG docker ubuntu && \ - apt-get clean + usermod -aG docker root + +RUN apt-get install software-properties-common -y && \ + apt-add-repository ppa:git-core/ppa && \ + apt-get install git -y + RUN \ # dev setup apt update && \ - apt-get install sudo jq bash-completion graphviz rsync software-properties-common gcc -y && \ - add-apt-repository ppa:git-core/ppa && \ - apt update && \ - apt-get install git -y && \ - usermod -aG sudo ubuntu && \ + apt-get install build-essential sudo jq bash-completion graphviz rsync software-properties-common -y && \ echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \ - echo '. /etc/bash_completion' >> /home/ubuntu/.bashrc && \ - echo 'export PS1="\[\e[32;1m\]\u\[\e[m\]@\[\e[34;1m\]\H\[\e[m\]:\[\e[33;1m\]\w\[\e[m\]$ "' >> /home/ubuntu/.bashrc && \ - chown ubuntu:nogroup /home/ubuntu/.bashrc && \ + echo '. /etc/bash_completion' >> /root/.bashrc && \ + echo 'export PS1="\[\e[32;1m\]\u\[\e[m\]@\[\e[34;1m\]\H\[\e[m\]:\[\e[33;1m\]\w\[\e[m\]$ "' >> /root/.bashrc && \ apt-get clean -USER ubuntu -ENV CARGO_HOME=/home/ubuntu/.cargo \ - PATH=/home/ubuntu/.cargo/bin:/home/ubuntu/.local/bin:$PATH -RUN \ - # install rust - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain=1.87.0 -y && \ +ENV PATH="/root/.cargo/bin:${PATH}" +RUN apt-get update && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y && \ # rust auto formatting rustup component add rustfmt && \ # rust style linter @@ -45,7 +37,10 @@ RUN \ # rust crate structure diagram cargo install cargo-modules && \ # expand rust macros (useful in debugging) - cargo install cargo-expand + cargo install cargo-expand && \ + apt-get clean + +ENV PATH=${PATH}:/root/.local/bin RUN \ # install python manager curl -LsSf https://astral.sh/uv/install.sh | sh && \ @@ -55,5 +50,5 @@ RUN \ # useful in examples uv pip install ipykernel eclipse-zenoh -p ~/.local/share/base && \ echo '. ~/.local/share/base/bin/activate' >> ~/.bashrc -ENV VIRTUAL_ENV=/home/ubuntu/.local/share/base +ENV VIRTUAL_ENV=/root/.local/share/base CMD ["bash", "-c", "sudo rm /var/run/docker.pid; sudo dockerd"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/cpu/devcontainer.json similarity index 83% rename from .devcontainer/devcontainer.json rename to .devcontainer/cpu/devcontainer.json index 87f5cd3..6c66222 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/cpu/devcontainer.json @@ -1,9 +1,9 @@ { - "name": "Development", - "dockerComposeFile": "docker-compose.yaml", + "name": "Development-CPU-ONLY", + "dockerComposeFile": "./docker-compose.yaml", "service": "ide", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", - "initializeCommand": ".devcontainer/make_env_file.py ${localWorkspaceFolder}", + "initializeCommand": ".devcontainer/make_env_file.py ${localWorkspaceFolder} ./cpu/", "postStartCommand": "mkdir -p tests/.tmp && docker system prune -fa && docker volume prune -f", "hostRequirements": { "cpus": 2, @@ -26,5 +26,8 @@ "ms-python.black-formatter" // Python code formatter ] } + }, + "features": { + "ghcr.io/meaningful-ooo/devcontainer-features/fish:2": {} // Fish shell } } diff --git a/.devcontainer/cpu/docker-compose.yaml b/.devcontainer/cpu/docker-compose.yaml new file mode 100644 index 0000000..0d3b537 --- /dev/null +++ b/.devcontainer/cpu/docker-compose.yaml @@ -0,0 +1,15 @@ +services: + ide: + build: + context: .. + dockerfile: ./Dockerfile + privileged: true # Docker-in-Docker needs this + cgroup: host # Allow setting resource constraints (e.g. memory, cpu) for containers + environment: + - RUST_BACKTRACE=1 # Display error trace on errors/panics + volumes: + - ${LOCAL_WORKSPACE_PATH}:${ENV_WORKSPACE_PATH} # source + - docker_data:/var/lib/docker # Docker image cache + - ${LOCAL_GIT_PATH}:${ENV_GIT_PATH} # Base Git worktree history +volumes: + docker_data: diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml deleted file mode 100644 index b52f7fa..0000000 --- a/.devcontainer/docker-compose.yaml +++ /dev/null @@ -1,15 +0,0 @@ -services: - ide: - build: - context: .. - dockerfile: .devcontainer/Dockerfile - privileged: true # Docker-in-Docker needs this - cgroup: host # Allow setting resource constraints (e.g. memory, cpu) for containers - environment: - - RUST_BACKTRACE=1 # Display error trace on errors/panics - volumes: - - ${LOCAL_WORKSPACE_PATH}:${ENV_WORKSPACE_PATH} # source - - docker_data:/var/lib/docker # Docker image cache - - ${LOCAL_GIT_PATH}:${ENV_GIT_PATH} # Base Git worktree history -volumes: - docker_data: diff --git a/.devcontainer/gpu/Dockerfile b/.devcontainer/gpu/Dockerfile deleted file mode 100644 index b7b99ad..0000000 --- a/.devcontainer/gpu/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -# DevContainer image -FROM nvidia/cuda:12.6.1-cudnn-runtime-ubuntu24.04 - -RUN \ - # install docker - apt-get update && \ - apt-get install ca-certificates curl gnupg lsb-release -y && \ - mkdir -m 0755 -p /etc/apt/keyrings && \ - curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ - apt-get update && \ - apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y && \ - usermod -aG docker root - -RUN apt-get install software-properties-common -y && \ - apt-add-repository ppa:git-core/ppa && \ - apt-get install git -y - -RUN \ - # dev setup - apt update && \ - apt-get install build-essential sudo jq bash-completion graphviz rsync software-properties-common -y && \ - echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \ - echo '. /etc/bash_completion' >> /root/.bashrc && \ - echo 'export PS1="\[\e[32;1m\]\u\[\e[m\]@\[\e[34;1m\]\H\[\e[m\]:\[\e[33;1m\]\w\[\e[m\]$ "' >> /root/.bashrc && \ - apt-get clean - -ENV PATH="/root/.cargo/bin:${PATH}" -RUN apt-get update && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y && \ - # rust auto formatting - rustup component add rustfmt && \ - # rust style linter - rustup component add clippy && \ - # rust code coverage - cargo install cargo-llvm-cov && \ - rustup component add llvm-tools-preview && \ - # rust crate structure diagram - cargo install cargo-modules && \ - # expand rust macros (useful in debugging) - cargo install cargo-expand && \ - apt-get clean - -ENV PATH=${PATH}:/root/.local/bin -RUN \ - # install python manager - curl -LsSf https://astral.sh/uv/install.sh | sh && \ - uv venv -p 3.10 ~/.local/share/base && \ - # pip package based on C lib/client - uv pip install cffi maturin[patchelf] -p ~/.local/share/base && \ - # useful in examples - uv pip install ipykernel eclipse-zenoh -p ~/.local/share/base && \ - echo '. ~/.local/share/base/bin/activate' >> ~/.bashrc -ENV VIRTUAL_ENV=/root/.local/share/base -CMD ["bash", "-c", "sudo rm /var/run/docker.pid; sudo dockerd"] diff --git a/.devcontainer/gpu/devcontainer.json b/.devcontainer/gpu/devcontainer.json index 0919d04..5a681dd 100644 --- a/.devcontainer/gpu/devcontainer.json +++ b/.devcontainer/gpu/devcontainer.json @@ -3,7 +3,7 @@ "dockerComposeFile": "./docker-compose.yaml", "service": "ide", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", - "initializeCommand": ".devcontainer/gpu/make_env_file.py ${localWorkspaceFolder}", + "initializeCommand": ".devcontainer/make_env_file.py ${localWorkspaceFolder} ./gpu/", "postStartCommand": "mkdir -p tests/.tmp && docker system prune -fa && docker volume prune -f", "hostRequirements": { "cpus": 2, diff --git a/.devcontainer/gpu/docker-compose.yaml b/.devcontainer/gpu/docker-compose.yaml index 7749b51..ba5d69f 100644 --- a/.devcontainer/gpu/docker-compose.yaml +++ b/.devcontainer/gpu/docker-compose.yaml @@ -2,21 +2,21 @@ services: ide: build: context: .. - dockerfile: ./gpu/Dockerfile - privileged: true # Docker-in-Docker needs this - cgroup: host # Allow setting resource constraints (e.g. memory, cpu) for containers + dockerfile: ./Dockerfile + privileged: true # Docker-in-Docker needs this + cgroup: host # Allow setting resource constraints (e.g. memory, cpu) for containers environment: - - RUST_BACKTRACE=1 # Display error trace on errors/panics + - RUST_BACKTRACE=1 # Display error trace on errors/panics volumes: - - ${LOCAL_WORKSPACE_PATH}:${ENV_WORKSPACE_PATH} # source - - docker_data:/var/lib/docker # Docker image cache - - ${LOCAL_GIT_PATH}:${ENV_GIT_PATH} # Base Git worktree history + - ${LOCAL_WORKSPACE_PATH}:${ENV_WORKSPACE_PATH} # source + - docker_data:/var/lib/docker # Docker image cache + - ${LOCAL_GIT_PATH}:${ENV_GIT_PATH} # Base Git worktree history deploy: resources: reservations: devices: - driver: nvidia count: all - capabilities: [gpu] + capabilities: [ gpu ] volumes: docker_data: diff --git a/.devcontainer/gpu/make_env_file.py b/.devcontainer/gpu/make_env_file.py deleted file mode 100755 index f231818..0000000 --- a/.devcontainer/gpu/make_env_file.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python3 -# -# assumes git worktree was made using relative paths e.g. -# git worktree add ../dir-name branch-name --relative-paths -import sys -from pathlib import Path -from textwrap import dedent -import subprocess -from os.path import relpath - - -def make_config(local_workspace_path: Path): - env_workspace_path = Path(f"/workspaces/{local_workspace_path.name}") - local_git_path = Path( - subprocess.run( - "git rev-parse --path-format=absolute --git-common-dir".split(" "), - capture_output=True, - text=True, - ).stdout.strip() - ) - env_git_path = ( - env_workspace_path / ".git" - if local_workspace_path / ".git" == local_git_path - else ( - env_workspace_path - / relpath(local_git_path.parent, local_workspace_path) - / ".git" - ).resolve() - ) - - return dedent( - f""" - LOCAL_WORKSPACE_PATH={local_workspace_path} - ENV_WORKSPACE_PATH={env_workspace_path} - LOCAL_GIT_PATH={local_git_path} - ENV_GIT_PATH={env_git_path} - """ - ).strip() - - -if __name__ == "__main__": - local_workspace_path = Path(sys.argv[1]) - - with open(Path(__file__).absolute().parent / ".env", "w") as f: - f.write(make_config(local_workspace_path)) diff --git a/.devcontainer/make_env_file.py b/.devcontainer/make_env_file.py index f231818..69c5a75 100755 --- a/.devcontainer/make_env_file.py +++ b/.devcontainer/make_env_file.py @@ -41,5 +41,5 @@ def make_config(local_workspace_path: Path): if __name__ == "__main__": local_workspace_path = Path(sys.argv[1]) - with open(Path(__file__).absolute().parent / ".env", "w") as f: + with open(Path(__file__).absolute().parent / f"{sys.argv[2]}.env", "w") as f: f.write(make_config(local_workspace_path))