最近、環境をなるべく壊さずに開発環境を保持できるDevContainerの立ち上げが少しずつ早くなってきました。 Docker(Desktop)を入れてれば(ここポイント)、準備しておいた開発環境を持ち込めるというものです。

※ Rancher Desktopを試して酷い目に遭いました、この部分はDDの方が一日の長あり。

基本的に私は、普通のDockerイメージを用意した上での『ちょい足し』をベースにやってます。

ベースの環境

例えば一例として、Jekyllによるブログ環境(書いてる環境)で対応してみるとすると、ざっくりこうなります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
FROM ruby:3

ARG USER=worker
ARG USER_UID=1000
ARG USER_GID=1000

RUN apt-get update; apt-get install -y  sudo git
RUN groupadd -g ${USER_GID} ${USER}; \
    useradd -m -s /bin/bash -g ${USER_GID} -u ${USER_UID} -G sudo ${USER}
RUN echo "${USER} ALL = (ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER}; \
    chmod 400  /etc/sudoers.d/${USER}
RUN mkdir /workspace; chown ${USER}:${USER} /workspace
WORKDIR /workspace
USER ${USER}
EXPOSE 4000

ポイントがちょっとあります。

  • 作業用ユーザーは準備しておく(間違ってもrootで作業とかNG)
  • 作業用ユーザーはsudo は使えるようにしておく
    • sudo のインストール
    • NOPASSWD:ALLsudoが動かせるようにしておく

この辺の原則を守っておくと概ねOKみたいです。 ここを崩さずに必要になるアプリ環境の準備をすれば概ねOKです。

コンテナ軌道をお手軽化するために、docker-compose.ymlもあわせて準備します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3'

services:
  blog:
    build:
      context: .devcontainer
    volumes:
      - .:/workspace
    ports:
      - 4000

DockerfileはDevContainerの管理ディレクトリ(.devcontainer)においているため、contextで場所を切り替えてますが、それ以外はシンプルな構成だと思います。

DevContainer対応

設定ファイル(.devcontainer/devcontainer.json)では、さしあたり『ちょい足し』設定を突っ込むことになります。

1
2
3
4
5
6
7
8
{
    "dockerComposeFile": [
        "../docker-compose.yml",
        "custom.yml"
    ],
    "service": "blog",
    "workspaceFolder": "/workspace"
}

docker-compose.ymlは追加設定(custom.yml)による重ね技を持ち込むようにしています。といってもこれだけ…

1
2
3
4
5
version: '3'

services:
  blog:
    command: sleep infinity

無限sleepを使ってコンテナが落ちないようにキープさせてるだけです。 なんならjekyll serveを走らせてもOKです(この部分はMakefileに書いてます。

これで、ブログ用のディレクトリを開いたら、“Reopen in Container"で切り替えできます。 さらにCodespacesを使って開かせることもできるので(検出して環境構築をしてくれる)、パソコンにてブラウザだけ(GitHubにログインできれば)で執筆可能です。 なんとまぁ便利な世の中に…