0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VimでDevcontainerを使用するために

Last updated at Posted at 2025-12-18

はじめに

開発環境の用意は、言語やライブラリのバージョンを揃え、必要に応じてビルドツールなどの導入を行うことで用意していましたが、Devcontainer の登場により開発環境をコードで定義して用意できるようになりました。現在では VS Code の拡張機能として導入が可能になり、開発環境の標準化に非常に有用です。

この記事では、DevcontainerVim(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 は VSCodeRemote - 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.jsonDockerfile を配置します。
この 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

確認できました!

527855107-2641df7a-6f50-45b7-9cc0-f1c7a3b7167d.png

まとめ

今回は VSCode 拡張機能ですでに利用されている Devcontainer について Vim(Neovim) でも使用できるよう構築を行いました。
OSやアーキテクチャの違いに加え、開発に使用するソフトウェアの違いも吸収できることで開発環境の統一化の一助とできることが実感できました。
今回はプライベートのローカルマシンで検証・構築を行いましたが、開発現場への導入も含め検討を進めていきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?