[小ネタ][Visual Studio Code]Dockerイメージの開発環境に作業用ユーザで接続する & Go言語でリモートデバッグをしてみる

2021.09.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以前、以下の記事にてDockerイメージの開発環境にVisual Studio Codeで接続することについて書きました。 Amazon Linux 2 の Dockerイメージから開発環境を作り Visual Studio Codeで接続してみる

こちらの記事では作業用のユーザとして「ec2-user」を作成していますが、Visual Studio Codeから接続した時には「root」ユーザとして接続していました。また接続後にVisual Studio Codeのターミナルで「$ su - ec2-user」を実行して作業用ユーザに切り替えていましたが、(前回は触れませんでしたが)この状態でリモートデバッグをしてもデバッグプロセスのユーザは「root」のままでした。

この辺りが実際の開発だと不便だったため、少しだけ修正して作業用ユーザで最初から接続する & リモートデバッグできるようしてみました。

修正した所

まず修正した所ですが、「Dockerfile」の最後の方に「ec2-user」を使用するための文を追加しました(27行目)。修正箇所はこれだけとなります。以下に「Dockerfile」を載せておきます。

FROM amazonlinux:2

# install amazon-linux-extras install
RUN amazon-linux-extras install -y

# yum update & install
RUN yum update -y \
    && yum install \
        systemd \
        tar \
        unzip \
        sudo \
        -y

# install aws cli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && sudo ./aws/install

# create user
RUN useradd "ec2-user" && echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers

# install for develop, etc.
RUN sudo amazon-linux-extras install golang1.11 -y

# change user
USER ec2-user

# init
CMD ["/sbin/init"]

動かしてみる

修正箇所はこれだけなのですが、実際に動かしてみたいと思います。前回同様、以下のコマンドでコンテナを起動します。

$ docker-compose up -d

コンテナを起動し、Visual Studio Codeの「Remote-Containers: Attach to Runnning Container...」よりコンテナに接続してターミナルを開きます。ターミナルを開いた直後にユーザを確認してみます。

$ echo $USER
ec2-user

ターミナル上ではユーザが作業用ユーザである「ec2-user」となっていることが分かるかと思います。

次にリモートデバッグをしてみます。前回は触れなかったのですが、Visual Studio Codeにはリモートでデバッグできる機能があります。今回は特に難しい設定をすることなく、右下に表示される以下のようなダイアログの「Install All」を押して、必要なコンポーネントが全てインストールされるのを待つだけで実行できました。(少し時間が掛かりました)

デバッグするコードは、以前と同じく「/share/src/sample.go」としてみました。

[ec2-user@xxxxxxxxxxxx ~]$ go version
go version go1.15.14 linux/amd64
[ec2-user@xxxxxxxxxxxx ~]$ mkdir /share/src
[ec2-user@xxxxxxxxxxxx ~]$ touch /share/src/sample.go

「sample.go」は今回はデバッグで実行しているユーザが分かるように以下のようにしてみました。

sample.go

package main

import (
	"fmt"
	"os/user"
)

func main() {
	fmt.Println("ok")

	user, err := user.Current()
	if err != nil {
		panic(err)
	}
	fmt.Printf("current user = %s\n", user.Username)
}

「Install All」にて全てのインストールが終わったら、「F5」キーなどでデバッガを起動し、以下のようにブレークポイントで止めてみると実行しているユーザが「ec2-user」であることが確認できました。

まとめ

たった一行を「Dockerfile」に追加しただけですが、作業効率がかなり上がったので記事として投稿いたしました。何かの役に立てば幸いです。