Skip to content

ifooth/devcontainer

Repository files navigation

DevContainer

Full stack remote development environment

Go Report Card lint build Docker Docker Pulls

Base on devcontainers/base image

Shell

  • zsh
  • oh-my-zsh
  • git - A distributed version control system
  • fzf - A command-line fuzzy finder
  • autojump - A cd command that learns - easily navigate directories from the command line
  • zsh-autosuggestions
  • direnv - unclutter your .profile, set env by dir automate

Vim

Plugin

tools

  • scc - scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go
  • restic - Fast, secure, efficient backup program
  • rclone - rsync for cloud storage
  • protoc - Protocol Buffers - Google's data interchange format
  • grpcurl - AboutLike cURL, but for gRPC: Command-line tool for interacting with gRPC servers

Dev.env

  • set pre / post script
  • set git config
  • set tz and so on
# 前后置脚本
PRE_SCRIPT_FILE=""
POST_SCRIPT_FILE=""

# git 配置
GIT_USER_NAME=""
GIT_USER_EMAIL=""
GIT_USER_SIGNINGKEY=""

# 时区配置
TZ=Asia/Shanghai

Python toolchain

  • uv - An extremely fast Python package and project manager, written in Rust.
  • ruff - An extremely fast Python linter and code formatter, written in Rust.
  • jupyterlab - JupyterLab computational environment.

usage

# switch python version
uv venv /root/.venv/hello-world -p /opt/python/py3/bin/python
source /root/.venv/hello-world/bin/activate

.envrc

export VIRTUAL_ENV="/root/.venv/hello-world"
layout python

.vscode/settings.json

{
    "python.defaultInterpreterPath": "/root/.venv/hello-world/bin/python"
}

Golang toolchain

usage

# install golang version
export HOME=/opt/go
go install golang.org/dl/go1.23.1@latest
go1.23.1 download

version list in golang/dl

.envrc

# switch golang version
export PATH=/opt/go/sdk/go1.23/bin:$PATH

.vscode/settings.json

{
    "go.goroot": "/opt/go/sdk/go1.23",
    "go.gopath": "/root/.go"
}

golang private mod settings

.vscode/settings.json

{
    "go.goroot": "/opt/go/sdk/go1.23",
    "go.gopath": "/root/.go",
    "go.toolsEnvVars": {
        "GOPROXY": "https://athens-proxy.townsy.io,direct",
        "GOPRIVATE": "",
        "GONOSUMDB": "townsy.private-github.com"
    },
    "terminal.integrated.env.linux": {
        "GOPROXY": "https://athens-proxy.townsy.io,direct",
        "GOPRIVATE": "",
        "GONOSUMDB": "townsy.private-github.com"
    }
}

Develop golang

You can refer to the official guidelines https://go.dev/doc/contribute

here is use vscode learn golang src

# clone go repo
git clone https://github.com/golang/go
cd go

# checkout the version you are interested in
git checkout release-branch.go1.23

# build go bin & pkg tools
cd src && ./make.bash && cd ..

# add `go.work` for src workspace
go work init
# change if you need
# go work edit -go=1.21
go work use src

# modify according to the following configuration
mkdir .vscode && vim .vscode/settings.json

add custom go.goroot settings

{
    "go.goroot": "/data/repos/golang/go"
}

all Go language server work perfect

Build linux kernel

build the linux kernel in the devcontainer, all tools has been installed

mkdir /data/kernel && cd /data/kernel
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.16.17.tar.xz # change version as you need
tar -xf linux-5.16.17.tar.xz
cd linux-5.16.17
make menuconfig # change config
make -j 10

Settings

auto install-extension

open the user settings editor from the Command Palette (Ctrl Shift P) with Preferences: Open User Settings(JSON).

{
    "remote.SSH.useLocalServer": true,
    "remote.SSH.suppressWindowsSshWarning": true,
    "remote.SSH.remotePlatform": {
        "devcontainer": "linux"
    },
    "remote.extensionKind": {
        "alefragnani.project-manager": [
            "workspace"
        ]
    },
    "remote.SSH.defaultExtensions": [
        "golang.go",
        "ms-python.python",
        "charliermarsh.ruff",
        "geddski.macros",
        "alefragnani.project-manager",
        "ms-azuretools.vscode-docker",
        "ms-vscode.makefile-tools",
        "quillaja.goasm",
        "davidanson.vscode-markdownlint",
        "redhat.vscode-yaml",
        "redhat.vscode-xml",
        "xaver.clang-format",
        "zxh404.vscode-proto3"
    ]
}

list-extensions

code --list-extensions --show-version

snippets

open the user settings editor from the Command Palette (Ctrl Shift P) with Snippets: Open User Snippets.

copy snippet to config, example go.json

{
    "import github.com/stretchr/testify/assert": {
        "prefix": "iassert",
        "body": "\"github.com/stretchr/testify/assert\"",
        "description": "Code snippet for import testify assert"
    },
    "import github.com/pkg/errors": {
        "prefix": "ipkgerr",
        "body": "\"github.com/pkg/errors\"",
        "description": "Code snippet for import pkg errors"
    }
}

vscode remote ssh settings

~/.vscode-server/data/Machine/settings.json

use the linked major version

{
    "go.goroot": "/opt/go/sdk/go1.23",
    "go.gopath": "/root/.go",
    "go.toolsEnvVars": {
        "GOBIN": "/opt/go/bin"
    },
    "go.lintTool": "golangci-lint",
    "go.lintFlags": [
        "-c",
        "/etc/.golangci.yml"
    ],
    "clang-format.style": "{IndentWidth: 4, BasedOnStyle: google, AlignConsecutiveAssignments: true, ColumnLimit: 0}",
    "python.linting.flake8Path": "/usr/local/bin/flake8",
    "python.linting.flake8Args": [
        "--max-line-length=119"
    ],
    "python.formatting.blackPath": "/usr/local/bin/black",
    "python.formatting.blackArgs": [
        "--line-length=119"
    ],
    "isort.path": [
        "/usr/local/bin/isort"
    ],
    "isort.args": [
        "--line-length=119"
    ],
    "python.terminal.activateEnvironment": false,
    "git.ignoredRepositories": [
        "/opt/pyenv"
    ],
    "projectManager.groupList": true,
    "projectManager.git.maxDepthRecursion": 4,
    "projectManager.git.ignoredFolders": [
        "code-review",
        "github"
    ],
    "projectManager.git.baseFolders": [
        "/data/repos"
    ],
    "editor.bracketPairColorization.enabled": false
}

Tips and Tricks

windows remote ssh cann't connection with zsh

error log:

zsh: bad math expression: operand expected at `*100000   ...'

solution: enable useLocalServer

{
    "remote.SSH.useLocalServer": true
}

maybe have non-Windows SSH installed issue, just ignore