はじめに
「Programming Kubernetes」という本を読むために、Golangをはじめました。
意識高そうな本届いたわ。お正月読もう pic.twitter.com/6SK1kaeNBd
— nishipy (@iamnishipy) December 20, 2019
Goの初心者が見るべきチュートリアルは、以下のようなサイトらしいです。
今回はそのうちの「Tour Of Go」をローカル環境やっていくために、VS Codeの拡張機能”Remote – Containers”でGoの環境を整えた時のメモを記します。(もちろんWebブラウザで経由でやることも可能)
この拡張機能を使うと、以下の図のようにローカルOS上に立ち上げたDockerコンテナの中で開発ができるので便利です。なお、図は公式サイトから引用しました。
https://code.visualstudio.com/assets/docs/remote/containers/architecture-containers.png
“Remote – Containers” は、以下のGitHubリポジトリで開発されています。
“Remote – Containers” を使って、 ”A Tour of Go”をやる
“Remote – Containers”で、Golangの環境を作成
ググったところ、Classmethodさんのこちらの記事に詳しく書いてあります。この通りに進めると、Golangの環境(Dockerコンテナ)が立ち上がります。
.devcontainerディレクトリ及び必要ファイルの自動生成
まず、動画のように[Add Deployment Container Configuration File]-[Go golang:1]を選択すると、コンテナ起動に必要なファイルを生成されます。
自動生成されたファイルがこちらです。
1 2 3 |
.devcontainer ├── Dockerfile └── devcontainer.json |
- Dockerfile
おなじみの、Dockerイメージをbuildするためのファイルです。中身はこんな感じです。コードはGitHubの公式リポジトリから拝借します。
golang:1
というイメージの上に、環境変数の設定とかパッケージやツールの追加をしていますね。細かいことは分からんけど。
- devcontainer.json
もう1つの devcontainer.json
は、この拡張機能特有のファイルのようですね。
こちらのリファレンスと見比べてみます。
パラメータ | 値 | 説明 |
---|---|---|
name | Go |
コンテナの名前として表示 |
dockerFile | Dockerfile |
Dockerfileを使う際には必須。Dockerfileのパスを指定 |
runArgs | [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ] |
docer run コマンドのオプションを指定 |
settings | "terminal.integrated.shell.linux": "/bin/bash", "go.gopath": "/go" |
コンテナ固有の設定を追加 |
extensions | "ms-vscode.go" |
作成時にコンテナ内にインストールする必要がある拡張機能を指定 |
開発環境用のコンテナは、既存のイメージとかdocker-composeを読み込ませて構築することもできるようなどで、いろんなパラメータがあります。今回は、Dockerfileを使ってイメージをbuildし、そのコンテナイメージをrunするみたいですので、このようなパラメータ構成になっています。
Golangの環境の実行
必要なファイルはできたので、あとは動画のように操作し、実行するだけです。初回起動時は、Dockerイメージのビルドが行われるので、少し時間がかかります。実行できるとVS Codeで表示されるTerminalが、Dockerコンテナのものになります。
試しにローカルマシン上でターミナルを新しく開いて、docker ps
してみると、当然ながらちゃんとコンテナができていました。
1 2 3 |
testdir $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c868366e823b vsc-testdir-cc8d86089c719b28f7a48df4162e153f "/bin/sh -c 'echo Co…" 18 minutes ago Up 4 minutes pensive_visvesvaraya |
ついでに、docker inspect
で詳細をみて軽くおきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
testdir $ docker inspect c868366e823b [ { "Id": "c868366e823bab54507b5c0781d3279c4d52c87406e10f185d974e0812f26ed9", "Created": "2020-03-05T08:35:53.0830375Z", "Path": "/bin/sh", "Args": [ "-c", "echo Container started ; while sleep 1; do :; done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 93282, "ExitCode": 0, "Error": "", "StartedAt": "2020-03-05T08:49:44.4802889Z", "FinishedAt": "2020-03-05T08:49:09.0703811Z" }, "Image": "sha256:d2d4337e3d73313ae97e4b2ccbc944d061838fe95cb5d08cc6f211e80d78c7fa", ........... ...(略).... ........... "Mounts": [ { "Type": "bind", "Source": "/Users/nishipy/testdir", "Destination": "/workspaces/testdir", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "c868366e823b", ........... ...(略).... ........... "Env": [ "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "GOLANG_VERSION=1.14", "GOPATH=/go", "DEBIAN_FRONTEND=dialog", "GO111MODULE=auto" ], "Cmd": [ "-c", "echo Container started ; while sleep 1; do :; done" ], "Image": "vsc-testdir-cc8d86089c719b28f7a48df4162e153f", ........... ...(略).... ........... }, "NetworkSettings": { ........... ...(略).... ........... } } ] |
Mounts
では、VS Codeで開いているフォルダ/Users/nishipy/testdir
が、コンテナ内の/workspaces/testdir
としてマウントされていることがわかります。またConfig.Cmd
では、コンテナが落ちないように、echo Container started ; while sleep 1; do :; done
という無限ループが書かれていますね。
作成した環境で、A Tour of Goをやる
VS Codeに表示されているTerminalから、下記ページの通りに操作します。
まず、go get github.com/atotto/go-tour-jp/gotour
の後に、gotour
と入力すると、Webサーバが立ち上がります。
1 2 3 4 5 6 |
root@c868366e823b:/workspaces/testdir# go get github.com/atotto/go-tour-jp/gotour root@c868366e823b:/workspaces/testdir# gotour 2020/03/05 09:10:16 Serving content from /go/src/github.com/atotto/go-tour-jp 2020/03/05 09:10:17 Please open your web browser and visit http://127.0.0.1:3999 2020/03/05 09:10:43 accepting connection from: 127.0.0.1:44478 2020/03/05 09:10:48 running snippet from: 127.0.0.1:44478 |
そして、言われた通り、ブラウザから http://127.0.0.1:3999
に完了です!
簡単に環境構築できて、すごいと思いました(小並)
さいごに
ということで、無事環境構築でき、勉強を始められました!いきなり、Interfaceで挫折を味わいましたが、「Golang 完全に理解した」と言えるまで、戦い続けます。。。
— nishipy (@iamnishipy) March 4, 2020
以上.
コメント