DockerでGoの開発環境を作りVisual Studio Codeでコーディングを行う

# 目的
ソースコードの編集はホストPCで行っているようにし、Dockerで立てたコンテナでビルドやバイナリの実行を行う。

## 経緯
何かの言語の開発環境をローカルに作ってみたいけど直接PCにインストールするのは気が引けるという場面がよくある(環境グチャグチャになりがち)。
以下の方針で進める
- Go langで開発をする
- Dockerでコンテナを立てることでローカル環境を汚さない
- コンテナをバインドマウントをすることで、ローカルで開発をしているような環境を作る

### 手順
1. docker-compose.yamlを作成し実行
1. Visual Studio CodeにDev Containersをインストールする
1. Go langプログラム作成する
1. 作成したプログラムをビルドして実行する

#### Step.1 docker-compose.yamlを作成し実行
```yaml:docker-compose.yml
version: '3'
services:
  golang:
    image: golang:1.19.11-alpine 
    ports:
      - 8080:80
    volumes:
      - type: bind
        source: "."
        target: "/go/src/app"
    tty: true
    restart: always
```

```bash
$ docker compose up -d

[+] Running 5/5
 ✔ golang 4 layers [⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                                   27.8s 
   ✔ 31e352740f53 Pull complete                                                                                                                                                     1.6s 
   ✔ 7f9bcf943fa5 Pull complete                                                                                                                                                     1.8s 
   ✔ 90ecaf4eb86e Pull complete                                                                                                                                                    21.9s 
   ✔ 2e1f0b61d268 Pull complete                                                                                                                                                    22.0s 
[+] Running 2/2
 ✔ Network docker-golang_default     Created                                                                                                                                        0.8s 
 ✔ Container docker-golang-golang-1  Started                                                                                                                                        8.8s 
```

#### Step.2 Visual Studio CodeにDev Containersをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/6d43d58f-6622-2177-324f-252c83e5a347.png)

Visual Studio CodeのサイドバーからRemote Explorerを選択する
起動中のコンテナが確認できる
接続したいコンテナを右クリック → Attach in New Window

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/d899a79c-e898-4cf4-ec82-90172d0cefae.png)

新しいウィンドウが開かれ左下にコンテナ名が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/25a9587e-6a5e-5893-b80f-870b74a2ffb9.png)

左上のOpen Floderソースコードのある場所を開く
docker-compose.yamlでtargetとして指定した/go/src/appがソースファイルの場所となる
(既にdocker-compose.ymlがあれば適切にバインドができている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/6c98ed18-a6ab-44b5-2e37-8d9b6f274ba2.png)

#### Step.3 Go langプログラム作成する
```go:hello.go
package main
import "fmt"

func main(){
	fmt.Printf("Hello, World!\n")
}
```

#### Step.4 作成したプログラムをビルドして実行する
Visual Studio CodeのメニューバーからTerminal → New Terminal
コンテナの標準ターミナルが開かれる(便利)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/41e1d305-c9c8-5443-fbb9-b3ba98065aba.png)

ターミナルでgoのインストール先やバージョンを調べてみる
```
/go/src/app # which go
/usr/local/go/bin/go

/go/src/app # go version
go version go1.19.11 linux/amd64
```
問題無さそう

ターミナルでの実行をしてみると無事にHello, World!が表示される
```
/go/src/app # go run hello.go
Hello, World!
```

ビルドしてバイナリを実行してみると無事にHello, World!が表示される
```
/go/src/app # go build hello.go
/go/src/app # ls
docker-compose.yml  hello               hello.go

/go/src/app # ./hello
Hello, World!
```

# あとがき
...Goの勉強しよう
開発予定のサービスのバックエンドをGoで書いてみるつもりなので勉強が必要そう
API的なものをとりあえずサクッと作ってみよう
DBもとりあえず絡めておこう
メリットとかデメリットは開発後に自分自身で感じたものをまとめます