(常識かもしれないのですが)「go言語でつくるインタプリタ」を現在読んでいてローカル環境との衝突がだるかったので、docker環境を構築しました。コンテナの中でテストしたり、インタラクティブモードを走らせられます。
一応Github Repo: https://github.com/greenteabiscuit/go-interpreter
monkey
フォルダが置いてあるところ(srcフォルダ直下)にDockerfile
とdocker-compose.yml
を配置します。
ファイル配置の全体像:
go-interpreter/ch01/src git:(master) ls
Dockerfile docker-compose.yml monkey
Dockerfile
:
# ベースとなるDockerイメージ指定
FROM golang:latest
# コンテナ内に作業ディレクトリを作成
# RUN mkdir /go/src
# コンテナログイン時のディレクトリ指定
WORKDIR /go/src
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src
docker-compose.yml
:
version: '3' # composeファイルのバーション指定
services:
app: # service名
build: . # ビルドに使用するDockerfileがあるディレクトリ指定
tty: true # コンテナの起動永続化
volumes:
- .:/go/src # マウントディレクトリ指定
environment:
- "GOPATH=/go"
実際のビルド手順:
$ cd go-interpreter/ch01/src
$ docker-compose up build
$ docker-compose up
テストする場合:
(In another directory)
$ docker exec -it containername /bin/bash
(Inside docker container)
/go/src# echo $GOPATH
/go
/go/src/monkey# go test ./lexer/
ok monkey/lexer 0.006s
REPL:
go run main.go
Hello root! This is the Monkey programming language
Feel free to type in commands
>> let add = fn(x,y) {x+y};
{Type:LET Literal:let}
{Type:IDENT Literal:add}
{Type:= Literal:=}
{Type:FUNCTION Literal:fn}
{Type:( Literal:(}
{Type:IDENT Literal:x}
{Type:, Literal:,}
{Type:IDENT Literal:y}
{Type:) Literal:)}
{Type:{ Literal:{}
{Type:IDENT Literal:x}
{Type:+ Literal:+}
{Type:IDENT Literal:y}
{Type:} Literal:}}
{Type:; Literal:;}
参考: