この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Amazon Linux 2のDockerイメージから開発環境として使うコンテナを作り、Visual Studio Codeで接続してみました。 コンテナは以下をインストール or 可能としてみました。
- AWS CLIをインストールする。かつクレデンシャルはローカルのものをコンテナ内でも使えるようにする。
- (開発言語として)Go言語をインストールする。
- ローカルマシンとコンテナで共有できるフォルダを作成する。
以下、今回作成した「docker-compose.yml」と「Dockerfile」について書いていきたいと思います。
作成したもの
ローカル環境について
本作業はMacで行いました。docker-composeとDockerがインストールされているものとします。docker-composeとDocker、Visual Studio Codeがインストールされているものとします。
Visual Studio Codeについては、コンテナに接続するためのRemote Containerをインストールしておいてください。
ローカルにAWSに接続可能なクレデンシャルがあるものとします。
フォルダ構成について
ローカルマシンのフォルダ内に、「docker-compose.yml」と「Dockerfile」、それとコンテナと共有するための「share」フォルダを作成します。構成としては以下のようになります。
.
├── Dockerfile
├── docker-compose.yml
└── share/
docker-compose.yml と Dockefileについて
「docker-compose.yml」は以下のようになりました。
docker-compose.yml
version: "3.7"
services:
amzn-linux-2:
build: .
container_name: amzn-linux-2
privileged: true
restart: always
volumes:
- type: bind
source: ./share
target: /share
- type: bind
source: ~/.aws
target: /home/ec2-user/.aws
「docker-compose.yml」ではクレデンシャルをコンテナと共有するため、9行目からの「volumes」にてローカルの「~/.aws」フォルダをコンテナとbindしています。またローカルの「share」フォルダをコンテナと共有するため、こちらも「volumes」にてbindするよう定義しています。 コンテナ名は「amzn-linux-2」としてみました。
「Dockerfile」は以下のようになりました。
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
# init
CMD ["/sbin/init"]
「Dockerfile」の1行目では、タイトルの書いたようにAmazon Linux 2 の Dockerイメージを使うため、「FROM amazonlinux:2」を記載しています。
4行目の「RUN amazon-linux-extras install -y」ですが、開発環境用ということで「amazon-linux-extras」をインストールしてみました。「amazon-linux-extras」を入れると、さまざまなパッケージをamazon-linux-extrasを使ってインストールすることができます。今回もこの後で書くGo言語のインストールで使用しています。 「amazon-linux-extras」については、以下も参考にしてみてください。
Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた
7・8行目からのyum installでは、今回必要だったものをyumを使ってインストールしています。案件によっては、wgetなど必要なものをここに追加してもいいと思います。
16行目では aws cli v2をインストールしています。
21行目では、作業用ユーザとして「ec2-user」を作成しています。このユーザ名は案件によって適宜変えてもいいかと思います。
24行目では、「amazon-linux-extras」を使いGo言語をインストールしています。ここも案件によっては違う言語を指定 or 必要なものをインストールすることになるかと思います。
コンテナを起動してVisual Studio Codeで接続してみる
「docker-compose.yml」と「Dockerfile」があるフォルダにて以下のコマンドを実行します。
$ docker-compose up -d
「docker ps」コマンドを叩き、「amzn-linux-2」のコンテナが動いていることを確認します。次にVisual Studio Codeを開き、コマンドパレットより「Remote-Containers: Attach to Runnning Container...」を選択します。動いているコンテナの一覧が表示されるので、起動した「amzn-linux-2」を選択します。
Remote Containerで接続できたら、Visual Studio Codeのターミナルを開きます。色々作業はできるかと思いますが、今回は「docker-compose.yml」「Dockerfile」にて設定やインストールしたものが使えるかを確認してみました。
まずユーザを「ec2-user」にしてみます。
$ su - ec2-user
[ec2-user@xxxxxxxxxxxx ~]$ pwd
/home/ec2-user
次にaws cliです。ターミナルにて以下のように入力し、aws cliのバージョンが表示されること、任意のクレデンシャル(以下の例では「sample」)で「aws s3 ls」コマンドが実行できることを確認してみます。
[ec2-user@xxxxxxxxxxxx ~]$ aws --version
aws-cli/2.2.30 Python/3.8.8 Linux/5.10.25-linuxkit exe/x86_64.amzn.2 prompt/off
[ec2-user@xxxxxxxxxxxx ~]$ aws s3 ls --profile sample
...(存在するS3バケットが表示される)
Go言語についても確認してみます。ローカルとの共有フォルダ「/share」に「src」フォルダを作り、そこに簡単な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
Go言語のプログラム「sample.go」は以下のようにしてみました。
sample.go
package main
import "fmt"
func main() {
fmt.Println("ok")
}
「sample.go」を作成したら、「go run」にて実行してみます。
[ec2-user@xxxxxxxxxxxx ~]$ go run /share/src/sample.go
ok
Go言語のプログラムが実行できることが確認できました。最後に、作成した「sample.go」がローカルの「share/src」フォルダに存在していて、コンテナと共有されていることを確認してください。
まとめ
今後よく使うであろうツール & 言語を入れたコンテナを作成してみました。案件のよってコンテナにインストールするものを変えることで、ローカルに色々インストールすることなく開発環境を構築できるのではないかと思います。 何かの役に立てば幸いです。
参考サイト
追記
以下の記事で作業用ユーザで接続してVisual Studio Codeでデバッグすることについて追加しました。
[小ネタ][Visual Studio Code]Dockerイメージの開発環境に作業用ユーザで接続する & Go言語でリモートデバッグをしてみる