Devpod.shを試してみる

# Devpod.sh」とは何ですか
先週末、Laravel-NestJsのブログ記事をいじっている最中に、「devpod」というツールのYouTube動画に偶然出会いました。興味本位でその動画をクリックし、そのツールを試してみることに興味を持ちました。
**では、devpodとは何でしょうか？**
[devpod.sh](https://www.devpod.sh)は、異なるベンダー間、Kubernetes、AWS、およびローカルのDockerの間で開発環境を共有するためのデスクトップアプリです。私はそれを短時間使ってみましたが、devcontainersを使用してリポジトリと一緒にクイックな環境をセットアップするようです。

## それを使って学んだことは何ですか？

devpodは、プリビルドのDockerイメージを使用してクイックな環境をセットアップし、異なるIDEに接続したり、ブラウザをIDEとして使用するための組み込みのVS Codeサーバーを提供するオプションさえあります。それはすごいですね。

## 私はそれを使いますか？

おそらく使わないでしょう...。なぜなら、プリビルドのDockerイメージを使用しているため、プロジェクトに適したDockerイメージを見つける必要がありますが、ローカルのDockerfileやdocker-composeとはうまく機能しないため、ローカル開発環境には使えません...。それを使用するためには、PHPとMySQL/PostgreSQLの両方が必要なPHPプラグインがすでにインストールされたDockerイメージを見つけるか、またはビルドする必要がありますが、それは本来のサービスコンテナを実行する目的に反するものです。一方、データベースに接続しないクイックなウェブサイトを共有したいだけであれば、devpodを使用して環境をセットアップするかもしれません。

## どのように変更して動作させるようになりましたか？

前述のように、devpodはプリビルドのイメージを使用しており、ローカルのDockerfileを使用することはできません。そのため、Laravelを動作させるために、単一のdevcontainer.jsonを作成しました。
```json
{
  "name": "larapod",
  "image": "php:8.1-fpm",
  "extensions": [
    "felixfbecker.php-debug",
    "editorconfig.editorconfig",
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint"
  ],
  "settings": {
    "php.validate.enable": true,
    "php.suggest.basic": false,
    "php.executablePath": "/usr/local/bin/php"
  },
  "mounts": [
    "source=/<Route To Project>/larapod,target=/workspace,type=bind,consistency=delegated"
  ],
  "postCreateCommand": "apt-get update && apt-get install -y build-essential default-mysql-client libpng-dev libjpeg62-turbo-dev libfreetype6-dev libzip-dev locales zip jpegoptim optipng pngquant gifsicle git unzip && cd /workspace && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && apt-get install -y libpq-dev && docker-php-ext-install pdo_pgsql && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && export NVM_DIR=\"$HOME/.nvm\" && [ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" && [ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" && nvm install lts/hydrogen && npm install -g pnpm && npm install -g @nestjs/cli",
  "remoteEnv": {
    "COMPOSER_ALLOW_SUPERUSER": "1"
  },
  "services": {
    "db": {
      "image": "mysql:latest",
      "ports": ["3306:3306"],
      "environment": {
        "MYSQL_DATABASE": "laravel",
        "MYSQL_USER": "laravel",
        "MYSQL_PASSWORD": "password",
        "MYSQL_ROOT_PASSWORD": "password"
      },
      "command": "mysqld --general-log=1 --general-log-file=/var/lib/mysql/general.log",
      "volumes": ["mysql_data:/var/lib/mysql"]
    },
    "redis": {
      "image": "redis:latest",
      "ports": ["6379:6379"],
      "volumes": ["redis_data:/data"]
    }
  },
  "forwardPorts": [3306, "db:3306", 8000, "redis:6379"],
  "remoteExtensions": ["ms-vscode-remote.vscode-remote-extensionpack"],
  "volumes": ["mysql_data:/var/lib/mysql", "redis_data:/data"]
}
```
この投稿からわかるように、postCommandでわたしはイメージ上にすべてのphpプラグインをインストールする必要がありました。そしてなぜか、データベースを宣言したにもかかわらず、ホストマシンからアクセスすることができません。

NuxtJsプロジェクトでは、もっと簡単でした。
```json
{
  "name": "devpodnodejs",
  "image": "node:lts-hydrogen",
  "postCreateCommand": "apt-get install git && npm install -g pnpm",
  //"forwardPorts": [3000,10800],
  "remoteExtensions": ["ms-vscode-remote.vscode-remote-extensionpack"]
}
```
当分の間は、開発にはローカルのDockerを引き続き使用しますが、devpod.shをTwitterのリストに追加して、重要な変更があるかどうかを見るつもりです。