🎉

【Deno】Dockerでdeno環境を作ってExpressサーバを実行するまで

2024/01/26に公開

学習用のNodeコンテナが超重たくなってきたので、新しく環境作るついでにDenoに乗り換えようってモチベーションで作りました。

とりあえずコンテナを立てる

完成後のディレクトリ構成はこんな感じ

.
├── .docker
│   └── deno
│       └── Dockerfile
├── .env
├── README.md
├── docker-compose.yml
└── main.ts

docker-compose.yml

基本的な設定のみにして、Denoコンテナの詳細はDockerfileに書いてます。

version: "3.9"

services:
  app:
    container_name: deno_app
    build:
      context: ./.docker/deno/
    ports:
      - 8000:8000
    volumes:
      - .:/src
      - deno_cache:/deno_dir
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DEV_DATABASE: ${POSTGRES_DEV_DATABASE}

  db:
    container_name: deno_db
    image: postgres
    ports:
      - 5432:5432
    volumes:
      - deno_db_cache:/var/lib/postgresql/data
    environment:
      POSTGRES_ALLOW_EMPTY_PASSWORD: "yes"
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DEV_DATABASE: ${POSTGRES_DEV_DATABASE}

volumes:
  deno_cache:
  deno_db_cache:

Dockerfile

ポイントは大きく下記4つです

  • deno用のイメージをFROMで指定
  • denoはnpmやyarnコマンドではなく、url指定でnpmレジストリからダウンドードするのでcurlとかを先にインストールしておく
  • deno環境でホットリロードするためのdenonをインストールして、ENVで環境変数を設定
  • CMDでdenonからサーバを実行する
    • main.tsはexpressサーバの記述

https://deno.land/x/denon@2.5.0

FROM denoland/deno:alpine

WORKDIR /src

RUN apk update
RUN apk add curl zip unzip
RUN deno install -qAf --unstable https://deno.land/x/denon/denon.ts

ENV PATH="/root/.deno/bin:$PATH"

COPY . .

EXPOSE 8000

CMD ["denon", "run", "-A", "main.ts"]

Exoressサーバの記述

expressの記法自体はnodeでもdenoでも変わりませんが、import部分が特徴的です。
npm:<packageName>@<version>の記法でurlを指定することでnpmレジストリからダウンロードして使うことができます。

// @deno-types="npm:@types/express@4"
import express, { Applicatopn, Request, Response } from "npm:express@4.18.2";

const app: Applicatopn = express();
const port = 8000;

app.get("/", (_req: Request, res: Response) => {
    res.status(200).send("Hello world");
});

app.listen(port, () => {
    console.log(`Listening on ${port}`);
});

動作検証

docker compose up -d --build

denonのホットリロードが効いているので、リロード毎にrestarting due to changes...のscriptが走って最新の状態をサーバに反映してくれます。

deno_app | [*] [daem] restarting due to changes...
deno_app | [*] [daem] watching path(s): **/*.*
deno_app | [*] [daem] watching extensions: ts,tsx,js,jsx,json
deno_app | [!] [#0] starting `deno run -A main.ts`
deno_app | [*] [daem] restarting due to changes...
deno_app | [*] [daem] watching path(s): **/*.*
deno_app | [*] [daem] watching extensions: ts,tsx,js,jsx,json
deno_app | [!] [#0] starting `deno run -A main.ts`
deno_app | Listening on 8000

☺️

Discussion