⚡
【Deno】Dockerで実行環境を用意する方法
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サーバーが起動できました!
参考
Discussion