From 5752476184de69fc2735be681a95c22bdab51648 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sat, 17 Jul 2021 11:49:23 -0700 Subject: [PATCH] VSCode Rust development container (#71) --- .devcontainer/.dockerignore | 5 +++ .devcontainer/Dockerfile | 1 + .devcontainer/README.md | 70 ++++++++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 40 ++++++++++++++++++ .devcontainer/docker-compose.yml | 31 ++++++++++++++ README.md | 6 +++ 6 files changed, 153 insertions(+) create mode 100644 .devcontainer/.dockerignore create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml diff --git a/.devcontainer/.dockerignore b/.devcontainer/.dockerignore new file mode 100644 index 0000000..ac9cb06 --- /dev/null +++ b/.devcontainer/.dockerignore @@ -0,0 +1,5 @@ +.dockerignore +devcontainer.json +docker-compose.yml +Dockerfile +README.md diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..6b5acec --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1 @@ +FROM qmcgaw/rustdevcontainer diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 0000000..921c2e1 --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,70 @@ +# Development container + +Development container that can be used with VSCode. + +It works on Linux, Windows and OSX. + +## Requirements + +- [VS code](https://code.visualstudio.com/download) installed +- [VS code remote containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) installed +- [Docker](https://www.docker.com/products/docker-desktop) installed and running +- [Docker Compose](https://docs.docker.com/compose/install/) installed + +## Setup + +1. Create the following files on your host if you don't have them: + + ```sh + touch ~/.gitconfig ~/.zsh_history + ``` + + Note that the development container will create the empty directories `~/.docker`, `~/.ssh` and `~/.kube` if you don't have them. + +1. **For Docker on OSX or Windows without WSL**: ensure your home directory `~` is accessible by Docker. +1. **For Docker on Windows without WSL:** if you want to use SSH keys, bind mount your host `~/.ssh` to `/tmp/.ssh` instead of `~/.ssh` by changing the `volumes` section in the [docker-compose.yml](docker-compose.yml). +1. Open the command palette in Visual Studio Code (CTRL+SHIFT+P). +1. Select `Remote-Containers: Open Folder in Container...` and choose the project directory. + +## Customization + +### Customize the image + +You can make changes to the [Dockerfile](Dockerfile) and then rebuild the image. For example, your Dockerfile could be: + +```Dockerfile +FROM qmcgaw/rustdevcontainer +RUN apk add curl +``` + +To rebuild the image, either: + +- With VSCode through the command palette, select `Remote-Containers: Rebuild and reopen in container` +- With a terminal, go to this directory and `docker-compose build` + +### Customize VS code settings + +You can customize **settings** and **extensions** in the [devcontainer.json](devcontainer.json) definition file. + +### Entrypoint script + +You can bind mount a shell script to `/home/vscode/.welcome.sh` to replace the [current welcome script](shell/.welcome.sh). + +### Publish a port + +To access a port from your host to your development container, publish a port in [docker-compose.yml](docker-compose.yml). You can also now do it directly with VSCode without restarting the container. + +### Run other services + +1. Modify [docker-compose.yml](docker-compose.yml) to launch other services at the same time as this development container, such as a test database: + + ```yml + database: + image: postgres + restart: always + environment: + POSTGRES_PASSWORD: password + ``` + +1. In [devcontainer.json](devcontainer.json), change the line `"runServices": ["vscode"],` to `"runServices": ["vscode", "database"],`. +1. In the VS code command palette, rebuild the container. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..6e44733 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,40 @@ +{ + "name": "prometheus_wireguard_exporter_dev", + "dockerComposeFile": ["docker-compose.yml"], + "service": "vscode", + "runServices": ["vscode"], + "shutdownAction": "stopCompose", + "postCreateCommand": "", + "workspaceFolder": "/workspace", + // "overrideCommand": "", + "extensions": [ + "matklad.rust-analyzer", + "tamasfe.even-better-toml", // for Cargo.toml + "eamodio.gitlens", // IDE Git information + "davidanson.vscode-markdownlint", + "ms-azuretools.vscode-docker", // Docker integration and linting + "shardulm94.trailing-spaces", // Show trailing spaces + "Gruntfuggly.todo-tree", // Highlights TODO comments + "bierner.emojisense", // Emoji sense for markdown + "stkb.rewrap", // rewrap comments after n characters on one line + "vscode-icons-team.vscode-icons", // Better file extension icons + "github.vscode-pull-request-github", // Github interaction + "redhat.vscode-yaml", // Kubernetes, Drone syntax highlighting + "bajdzis.vscode-database", // Supports connections to mysql or postgres, over SSL, socked + "IBM.output-colorizer", // Colorize your output/test logs + // "mohsen1.prettify-json", // Prettify JSON data + // "zxh404.vscode-proto3", // Supports Proto syntax + // "jrebocho.vscode-random", // Generates random values + // "alefragnani.Bookmarks", // Manage bookmarks + // "quicktype.quicktype", // Paste JSON as code + // "spikespaz.vscode-smoothtype", // smooth cursor animation + ], + "settings": { + "files.eol": "\n", + "remote.extensionKind": { + "ms-azuretools.vscode-docker": "workspace" + }, + "editor.codeActionsOnSaveTimeout": 3000, + "rust-analyzer.serverPath": "/usr/local/bin/rust-analyzer" + } +} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..46d0764 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.7" + +services: + vscode: + build: . + image: rustdevcontainer + volumes: + - ../:/workspace + # Docker + - ~/.docker:/root/.docker:z + # Docker socket to access Docker server + - /var/run/docker.sock:/var/run/docker.sock + # SSH directory for Linux, OSX and WSL + - ~/.ssh:/root/.ssh:z + # For Windows without WSL, a copy will be made + # from /tmp/.ssh to ~/.ssh to fix permissions + # - ~/.ssh:/tmp/.ssh:ro + # Shell history persistence + - ~/.zsh_history:/root/.zsh_history:z + # Git config + - ~/.gitconfig:/root/.gitconfig:z + # Kubernetes + - ~/.kube:/root/.kube:z + environment: + - TZ= + # Needed for debugging + # cap_add: + # - SYS_PTRACE + # security_opt: + # - seccomp:unconfined + entrypoint: zsh -c "while sleep 1000; do :; done" diff --git a/README.md b/README.md index 7dcdc4b..f771fae 100644 --- a/README.md +++ b/README.md @@ -289,3 +289,9 @@ cargo clippy # Build the Docker image docker build -t mindflavor/prometheus_wireguard_exporter . ``` + +### VSCode development container + +This is more of a plug and play solution based on Docker and VSCode. + +See [.devcontainer/README.md](https://github.com/MindFlavor/prometheus_wireguard_exporter/blob/master/.devcontainer/README.md)