【Deno】Dockerで実行環境を用意する方法

2022/06/16に公開

Deno の 実行環境を、Dockerコンテナで用意しました。

目標

  • Dockerfileを自作して、イメージを作ってみる
  • コンテナにDenoをインストールして、触れる環境を作る
  • Denoの標準APIを使用して、Webサーバーを立ち上げる

Dockerfileを作成

コンテナイメージの元となるDockerfileを作成します。

FROM debian:stable-slim

WORKDIR /var/www/html

RUN apt-get -qq update \
  && apt-get -qq -y install curl zip unzip \
  && curl -fsSL https://deno.land/x/install/install.sh | sh \
  && apt-get -qq remove curl zip unzip \
  && apt-get -qq remove --purge -y curl zip unzip \
  && apt-get -qq -y autoremove \
  && apt-get -qq clean \
  && echo 'export DENO_INSTALL="/root/.deno"' >> ~/.bash_profile \
  && echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.bash_profile

CMD ["/bin/bash", "-c", "source ~/.bash_profile && bash"]

Dockerfileの内容

基本設定

  • OS: 今回は軽量なdebian-slimを選択。
FROM debian:stable-slim
  • WORKDIR: 今回はWebサーバーを起動させるので、/var/www/htmlを作業ディレクトリに指定。
WORKDIR /var/www/html

Denoのインストール

基本的には、Deno公式のやり方と同じです。

  • Denoのインストール
  • シェルスクリプトの実行に必要なcurl zip unzipをインストール
RUN apt-get -qq -y install curl zip unzip

Deno公式のやり方と同じようにインストールコマンドを実行。

RUN curl -fsSL https://deno.land/x/install/install.sh | sh

クリンナップ

不要なファイルを削除。
—purge オプションを使用すると設定ファイルごとすべて削除できる。(再び使わないようなパッケージに使用する)

RUN apt-get -qq remove --purge -y curl zip unzip

不要になった依存パッケージまで削除。

RUN apt-get -qq -y autoremove

パスを通す

denoコマンドを使用するために、パスを通す。

RUN echo 'export DENO_INSTALL="/root/.deno"' >> ~/.bash_profile \
  && echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.bash_profile

たった今変更したプロファイルを、bashに適用します。
CMDにはコンテナ起動直後に実行されるコマンドを記述します。
コンテナ起動後も引き続きbashを使用するので、最後に&& bashを引っ付けておきました。

CMD ["/bin/bash", "-c", "source ~/.bash_profile && bash"]

イメージのビルド

-t オプションをつけることで、名前をつけてイメージをビルドします。今回はdeno-dockerと名付けました。
Dockerfileを作ったディレクトリで、以下のコマンドを実行します。

docker build ./ -t deno-docker

コンテナの起動

以下のコマンドで、コンテナを起動します。

ちょっと長いですが…

docker container run -it --rm -p 8080:8080 --mount src=`pwd`,target=/var/www/html,type=bind --disable-content-trust deno-docker

1行づつコメントを以下につけました。

docker container run \ # コンテナ起動
-it \ # コンテナに入って標準入力を待ち受ける
-p 8080:8080 \ # ポートの指定(ホストのポート:コンテナのポート)
--rm \ # コンテナを停止したら自動でコンテナ廃棄する
--mount src=`pwd`,target=/var/www/html,type=bind\ # バインドマウント
--disable-content-trust\ # 証明書のないイメージを信頼する
deno-docker # 先ほど作成したイメージ

DenoでWebサーバーを立ち上げる

コチラも公式チュートリアルのままです。
詳しい解説は、公式から確認できます。

main.ts
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";

const s = serve({ port: 8080 }); // コンテナに指定したポート
console.log("http://localhost:8080/");

for await (const req of s) {
  req.respond({ body: "<h1>Hello Deno</h1>\n" });
}
  • Denoは標準でTypescriptをサポートしています。面倒な設定は不要。✋
  • asyncなしで、awaitが使用可能。

denoコマンドで実行する

先ほどバインドマウントしたディレクトリに、Typescriptファイル(今回はhelloDeno.ts)を保存し、
以下のコマンドを実行します。

deno run --allow-net main.ts

これで、Webサーバーが起動できました!


参考

https://deno.land/
https://future-architect.github.io/articles/20200612/
https://dev.to/francescoxx/docker-deno-containerize-a-deno-hello-world-server-1ha1
https://qiita.com/shisama/items/d2b802ca2afaab2c359a
https://tech-lab.sios.jp/archives/18811

Discussion