単純にDocker上でDenoを実行するだけなら、下記のコマンドで実行される。
$ docker run hayd/alpine-deno
でもそれだけだと、下記のように、denoが起動して終わりである。実行はできているが、屁理屈である。
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using latest version (0.68.0) for https://deno.land/std/examples/welcome.ts
Download https://deno.land/std@0.68.0/examples/welcome.ts
Check https://deno.land/std@0.68.0/examples/welcome.ts
Welcome to Deno 🦕
コマンドライン上でコードを書いて実行したい場合は下記でREPLが実行される。
$ docker run hayd/alpine-deno repl
一見これでよさそうだが、Dockerの中で標準入力を受け付けるだけで、Dockerの外で標準入力を受け付けてくれない。
そこで、下記のように-t
オプションをつけて、自分の使っているコマンドライン上の標準入力を受け付ける。
$ docker run -t hayd/alpine-deno repl
これでいけそうであるが、下記のように怒られて、入力できそうなのにできない。
Deno 1.3.3
exit using ctrl+d or close()
WARN RS - rustyline:718 - cannot read initial cursor location
>
-i
オプションで標準入力をアタッチしないといけないらしい。正直仕組みはよくわからない。
$ docker run -i -t hayd/alpine-deno repl
これで、console.log
などが試せる。
Deno 1.3.3
exit using ctrl+d or close()
> console.log('hell word')
hell word
undefined
>
main.tsなどのファイルを実行したい場合は、Dockerfileを作ると便利。
FROM hayd/alpine-deno
WORKDIR /app
COPY . .
CMD [ "run", "--allow-net", "src/main.ts" ]
Dockerfileがあるフォルダの中でsrc/main.ts
を作る。
import { serve } from "https://deno.land/std@0.68.0/http/server.ts";
const s = serve({ port: 8080 });
console.log("http://localhost:8080/");
for await (const req of s) {
req.respond({ body: "<h1>Hell Word</h1>\n" });
}
Dockerfileがある場所で下記を実行する。
$ docker build -t deno .
-t
で指定することでここではdenoという名前(タグ名)のイメージが作成される。
あとは下記のコマンドでmain.tsを実行できる。
$ docker run -p 8080:8080 deno
-p
でDockerの中の8080番ポートを、自分が今使っているローカル環境の8080番ポートに紐づけることで、ローカル環境のブラウザで
http://localhost:8080/
からアクセスできるようになる。