💤

Podman+コンテナ +SSH+ Zed Editor で開発環境構築!

に公開

Zed Editorでコンテナ環境の開発できないか?と思い、調べていたところ、devPodで構築する方法に辿り着きました。今回はdockerよりも軽量のpodmanを使用しています。

今回のゴール

Dockerfile, docker-compose.yml, devcontainer.json,authorized_keysの4つのファイルを使って、Podman コンテナ上に Zed Editor の開発環境を構築し、実際に Zed Editor からコンテナに接続して開発できるようにします。authorized_keysはSSH接続に求められる秘密鍵です。
devpod-container/
└── .devcontainer/
└──authorized_keys
└── Dockerfile
└──docker-compose.yml
└──devcontainer.json

  1. インストール

まずは、必要なツールをインストールしましょう。

Zed Editor: 公式サイトからダウンロードしてインストールしてください。
https://zed.dev/

Podman: Podman 公式サイトの手順に従ってインストールしてください。
https://podman.io/docs/installation

DevPod: DevPod 公式サイトからインストールしてください。DevPod は、Dev Containers 環境を簡単に作成・管理できる便利なツールです。
https://devpod.sh/

2.ファイルの準備
次に、開発環境の設定ファイルを用意します。devpod-container ディレクトリを作成し、その中に .devcontainer ディレクトリを作成、さらにその中に以下の4つのファイルを作成してください。
イメージは下記の通りです。

各ファイルの内容は下記の通りです。
Dockerfile

FROM ubuntu:latest

# パッケージリストを更新し、必要なパッケージをインストール
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
    bash \
    coreutils \
    procps\
    tini \
    nano \
    openssh-server \
    sudo && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# SSHの設定を行う
RUN mkdir /var/run/sshd && \
    echo 'root:123' | chpasswd

#ssh接続の認証設定
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config \
    && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \
    && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config \
    && echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config \
    && echo "UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
#秘密鍵をコピー
COPY authorized_keys /root/.ssh/authorized_keys
RUN chmod 700 /root/.ssh && chmod 600 /root/.ssh/authorized_keys && \
    chown root:root /root/.ssh/authorized_keys
RUN echo "" > /root/.bashrc

# Tiniをエントリーポイントに設定
ENTRYPOINT ["/usr/bin/tini", "--"]

# SSHサービスを起動し、コンテナを終了しないようにする
CMD ["/usr/sbin/sshd", "-D"]

CMD ["/usr/sbin/sshd", "-D"]はコンテナを起動し続けるためのコマンドです。
docker-compose.yml

services:
  devpod-dev:
    build:
      context: .
      dockerfile: Dockerfile 

    container_name: devpod-container
    restart: unless-stopped
    volumes:
      - .:/app

    ports:
      - "2222:22"

services: devpod-dev:: devpod-dev というサービス (コンテナ) を定義します。このサービス名 (devpod-dev) は後で devcontainer.json で指定します。

  • build: .: Dockerfile を使ってイメージをビルドすることを指定します。. は Dockerfile が docker-compose.yml と同じディレクトリにあることを意味します。
  • restart: unless-stopped: コンテナが予期せず停止した場合に、自動的に再起動するように設定します。

devcontainer.json
buildを同じディレクトリのDockerfileに指定します。

{
  "name": "devpod-dev",
  "dockerComposeFile": ["docker-compose.yml"],
  "service": "devpod-dev",

  "workspaceFolder": "/app",
  "build": {
    "dockerfile": "Dockerfile",
    "context": "."
  },
  "remoteUser": "root",
  "shutdownAction": "stopCompose"
}


  • dockerComposeFile: ["docker-compose.yml"]: 使用する docker-compose.yml ファイルを指定します。

  • service: "devpod-dev": docker-compose.yml で定義した devpod-dev サービスを、開発コンテナとして使用することを指定します。

  • workspaceFolder: "/app": Zed Editor でコンテナに接続した際に、最初に開くワークスペースのパスを /app ディレクトリに設定します。docker-compose.yml でボリュームマウント設定をした /app ディレクトリを指定することで、ホスト側のファイルがワークスペースとして開かれます。

秘密鍵authorized_keysの作成方法

ssh-keygen -t rsa

odsフォルダー直下の.sshフォルダーに秘密鍵が生成されるので、秘密鍵〇〇.pubファイルを.devcontainer直下にコピーし、authorized_keysに名前を変更する。

DevPodの設定
DevPod を使ってコンテナを立ち上げます。DevPod の設定画面を開き、以下の手順で設定してください。

Provider: 「Docker」を選択します。
Docker Path: Podman を使用する場合は、Docker Path に podman と入力します。これにより、DevPod が Docker の代わりに Podman を使用するようになります。
ProviderのDockerを選択し、DockerPathにpodmanを入力。

Workspaceを選択し、podmanの「create」をクリック。

フォルダーを選択し、ディレクトリを入力

Devcontainer Pathに自分がEnter Workspaceで選択したディレクトリの中にある「devontainer.json」の相対パスを入力する。
今回は「.devcontainer/devcontainer.json」を入力。

後はcreate workspaceをクリックしたら、コンテナが立ち上がり、remote接続した、zed editorが立ち上がります。

まとめ

これで、Podman コンテナ + Zed Editor の開発環境が完成しました!

DevPod を使うことで、Zed Editorでも簡単にコンテナ開発環境を構築・管理できます。今回の設定をベースに、ぜひ色々な開発環境を試してみてください。

おわりに

最後までお読みいただきありがとうございました!

Discussion