はじめに
開発環境の用意は、言語やライブラリのバージョンを揃え、必要に応じてビルドツールなどの導入を行うことで用意していましたが、Devcontainer の登場により開発環境をコードで定義して用意できるようになりました。現在では VS Code の拡張機能として導入が可能になり、開発環境の標準化に非常に有用です。
この記事では、DevcontainerをVim(Neovim)でも使用するために調査した内容を記載しています。この記事は、Qiita 3-shake Advent Calendar 2025 シリーズ1 18日目の記事です。
Devcontainer とは
Devcontainer(Development Container)は開発環境をコンテナとして定義し、プロジェクトごとに標準化された、再現性の高い環境を提供するための強力なアプローチです。
冒頭で記載した個々の用意の大幅をスキップし導入できることで、
- 「開発環境を整えるのに時間がかかる」
- 「Aさんの環境では動くのにBさんの環境では動かない」
といった、開発初期やチーム間の環境差異による問題を解決の一助となります。
開発環境のコンテナ化
Devcontainerは、Dockerやその他のコンテナ技術を利用して、開発に必要なすべてのツール・ランタイム・依存関係を含む環境をコンテナイメージとして定義します。
- OS・言語ランタイム: Node.js、Python、Go、Javaなど、プロジェクトで使用する言語の特定のバージョン
- ツールとライブラリ: Git、SSHクライアント、データベースクライアント、テストフレームワーク
- 設定: 環境変数やポートフォワーディング設定
これらの設定をコード(devcontainer.json) として管理することで、開発環境をバージョン管理システムに含めることができ、
その環境自体をプロジェクトの一部として扱えるようになります。
VSCode との連携
Devcontainer は VSCode の Remote - Containers という拡張機能を使用することで簡単に導入することができます。
これによりコンテナ内で直接コードの編集が可能となり、実行・テストも問題なく実行できます。
しかし、私のメインエディタは Vim(Neovim) なのでした...。
open-devcontainer
open-devcontainerという OSS があります。
Devcontainer API の仕様に準拠し実装されていて、かつVSCodeで提供されている一部の機能も実装されています。
Open Devcontainer is an open source, spec-compliant implementation of Visual
Studio Code's Development Container toolkit. It aims to fully implement the
devcontainer.json specification, as well as providing additional developer
tooling that the VS Code Remote - Containers extension provides, such as SSH and
GPG forwarding and automatic dotfiles installation.
Readme に記載されているとおりエディターと併用する方法が紹介されていて、Neovimも含まれています。今回はこちらを使用していきます。
Install odc
Go を build してもよいですが手っ取り早く使いたい場合、バイナリが公開されているのでそちらをダウンロードして利用するとよいです。
# Linux AMD64 の場合
wget https://gitlab.com/api/v4/projects/33929624/packages/generic/odc/0.6.9/linux-amd64 -O odc
chmod +x odc
sudo mv odc /usr/local/bin/odc
How to use odc
devcontainer を使うには、.devcontainer ディレクトリを用意し その中に devcontainer.json と Dockerfile を配置します。
この Dockerfile が開発環境として使用するコンテナとなります。開発環境のコンテナを定義する Dockerfile の命名は自由です。devcontainer.json の中で指定します。
$ tree -a
.
├── .devcontainer
│ ├── Dockerfile
│ └── devcontainer.json
:
:
devcontainer.json
{
"name": "Open Dev Container Environment",
"build": {
"dockerfile": "Dockerfile",
"args": {
"USERNAME": "devuser",
"USER_UID": "1000",
"USER_GID": "1000"
}
},
"features": {
"ghcr.io/devcontainers/features/sshd:1": {},
"ghcr.io/devcontainers/features/python:1": {
"version": "3.12"
}
},
"remoteUser": "devuser",
"postCreateCommand": "echo 'Hello from inside the container!'",
"appPort": ["127.0.0.1:2222:2222"],
"mounts": [
"source=${localEnv:HOME}/.gitconfig,target=/home/devuser/.gitconfig,type=bind,consistency=cache",
]
}
- Dockerfile
# ベースイメージ: Debian Bookworm Slim
FROM debian:bookworm-slim
# 環境設定
ENV DEBIAN_FRONTEND=noninteractive
# 開発ツールのインストール
RUN apt update
&& apt install -y --no-install-recommends
curl
git
build-essential
zsh
vim
sudo
gnupg2
wget
ca-certificates
&& apt-get clean
&& rm -rf /var/lib/apt/lists/*
RUN chmod o+w /usr/local/bin
ARG USERNAME=devuser
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
&& apt-get update
&& apt-get install -y sudo
&& echo $USERNAME ALL=(ALL) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME
&& chmod 0440 /etc/sudoers.d/$USERNAME
# ワークスペースディレクトリの設定
WORKDIR /workspaces/${containerWorkspaceFolder}
# デフォルトユーザーとして切り替え
USER $USERNAME
odc run & odc attach
odc run を実行したところコンテナイメージは作成されたように見えます。
Successfully built 1e3f229fa8c8
Successfully tagged odc-vari-stream-yt-dlp-314016-image:latest
odc run を実行するとコンテナイメージが作成されますが、必要なパッケージが不足している場合はエラーが発生することがあります。
- gnupg2
9:38PM ERR Failed to run in container error="OCI runtime exec failed: exec failed: unable to start container process: exec: \"gpgconf\": executable file not found in $PATH\r\n" command="gpgconf --list-dirs agent-socket"
open-devcontainer はローカル環境からコンテナへ SSH/GPG エージェントを転送を行うことでコンテナ環境のセキュリティを向上させます。そのため GnuPG パッケージが必要です。
:
RUN apt install gnupg2
:
- wget
9:45PM ERR Failed to run in container error="sudo: wget: command not found\n" command="/bin/bash -c sudo wget https://gitlab.com/api/v4/projects/33929624/packages/generic/odc-pipes/0.6.9/linux-amd64 -q -O /usr/local/bin/odc-pipes"
外部からバイナリやパッケージを得るためにインストールします。
:
RUN apt install wget
:
- odc-pipes, gocat
wget によるバイナリダウンロードのエラーログが表示されますが、コンテナアタッチして確認するとバイナリの存在が確認できるので今回は無視しました。
10:19PM ERR Failed to run in container error= command="/bin/bash -c sudo wget https://gitlab.com/api/v4/projects/33929624/packages/generic/odc-pipes/0.6.9/linux-amd64 -q -O /usr/local/bin/odc-pipes"
10:19PM ERR Failed to run in container error= command="/bin/bash -c sudo wget https://github.com/sumup-oss/gocat/releases/download/v0.2.0/gocat-v0.2.0-linux-amd64 -q -O /usr/local/bin/gocat"
docker ps を確認すると今回作成したかった開発環境用コンテナは起動しているように見えます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c129b4fa49e4 odc-testdir-3c3b56-image "/bin/sh -c 'while s…" About a minute ago Up About a minute 127.0.0.1:2222->2222/tcp odc-testdir-3c3b56
この状態で odc attach を実行すると起動しているコンテナの中にログインすることが出来ました。ls を実行すると app ディレクトリや readme.md ファイルがコンテナにも存在することを確認できました。
$ odc attach
devuser@c129b4fa49e4:/workspaces/test-dir$ ls
CLAUDE.md Dockerfile app build.sh readme.md
# コンテナビルド時にエラーが発生していたバイナリも配置されている。
devuser@c129b4fa49e4:/workspaces/testdir$ ls /usr/local/bin/odc-pipes
/usr/local/bin/odc-pipes
devuser@c129b4fa49e4:/workspaces/testdir$ ls /usr/local/bin/gocat
/usr/local/bin/gocat
拡張機能
open-devcontainer には紹介した基本的な Devcontainer の機能以外の拡張機能を使用することができます。以下がその拡張機能です。
- エージェント転送: ホストからコンテナへのSSHエージェントとGPGエージェントの転送。
- コンテナから Git 関連の SSH 接続が可能
- ドットファイル自動インストール: 開発環境をパーソナライズするためのドットファイルリポジトリの自動インストール。
- ライフサイクルスクリプトの実行: onCreateCommand、postCreateCommandなどのDevcontainerライフサイクルスクリプトのサポート。
- Git設定のミラーリング: ホストマシンのGit設定をコンテナに反映。
- odc forward
- 開発環境コンテナ内で稼働しているサービスにローカルからアクセスしたいとき
odc forward --port 3000などとすると、ローカルマシンのブラウザからhttp://localhost:3000でアクセスできる - docker run -p は静的だが odc forward は動的(3000があいていなかったら3001を自動的に採番する)
- 開発環境コンテナ内で稼働しているサービスにローカルからアクセスしたいとき
中でも ドットファイルの自動インストール は有益で .vimrc に代表されるようなドットファイルを同時に取り入れることによって、ローカル環境で Neovim を使用している感覚に近づけることができます。
ドットファイルの自動インストール
定義するのは簡単で、odc run を実行するタイミングで引数 --dotfiles-repo (repository url) をつけて実行します。
$ odc run --dotfiles-repo (repository url)
コンテナ内に導入したいリポジトリには、
-
installファイルを用意する - 実行権を付与する
- コンテナで操作したい内容をシェルスクリプトで記載する
を行っておきます。今回使用した install スクリプトはこちらにおいてあります。
証明書関連のエラーが出た場合は ca-certificates パッケージをインストールします。
11:59PM ERR Failed to run in container error="Cloning into '/home/devuser/dotfiles'...\nfatal: unable to access 'https://github.com/paraselene92/dotfiles-repository/': server certificate verification failed. CAfile: none CRLfile: none\n" command="/bin/bash -c git clone https://github.com/paraselene92/dotfiles-repository $HOME/dotfiles"
RUN apt install ca-certificates
実際に odc run および odc attach を行いコンテナ内で期待する動作をとるかどうか確認をしてみます。
$ odc run --dotfiles-repo (repostiroy url)
$ odc attach
確認できました!
まとめ
今回は VSCode 拡張機能ですでに利用されている Devcontainer について Vim(Neovim) でも使用できるよう構築を行いました。
OSやアーキテクチャの違いに加え、開発に使用するソフトウェアの違いも吸収できることで開発環境の統一化の一助とできることが実感できました。
今回はプライベートのローカルマシンで検証・構築を行いましたが、開発現場への導入も含め検討を進めていきたいと思います。
