その他

【Docker入門】Deno環境をDockerで構築する🐳🦕

その他
この記事は約6分で読めます。

はじめに

※ 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

今回は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サーバーを立ち上げる

コチラも公式チュートリアルのまんまです。

詳しい解説は、公式から確認できます。

helloDeno.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 helloDeno.ts

Denoは標準でファイル、ネットワーク、環境変数等にアクセスすることができないセキュアな設定になっています。

ネットワークを許可するには--allow-netオプションを付与して実行します。

見事、Webサーバーが起動できました!

まとめ

  • Dockerfileを自作して、イメージを作ることができた
  • コンテナにDenoをインストールして、(少しだけど)Denoプログラムを書けた
  • Denoの標準APIを使用して、Webサーバーを立ち上げた

参考