🎉
【Deno】Dockerでdeno環境を作ってExpressサーバを実行するまで
学習用の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サーバの記述
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