本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは,
本稿のサンプルコードは,
- 注1)
- 執筆時点
(2020年3月) で最新のDocker Engine 19. 03. 8を使用しています。 - 注2)
- 執筆時点で最新のdocker-compose 1.
25. 4を使用しています。
リモートの開発環境もDocker化
2013年3月のDockerの登場から7年が経ちました。周辺ツールの充実もあり,
しかし,
Amazon ECS──クラウドで動作するマネージドコンテナサービス
(1)
ECSは,
ECSについて詳しくは,
Amazon ECSにデプロイできるPerlアプリケーションを作ろう
本項では,
アプリケーションのディレクトリ構造
今回は,application
以下に,
$ tree -a
.
├── .github
│ └── workflows
│ ├── aws.yml
│ └── perl.yml
├── application
│ ├── Dockerfile
│ ├── app.psgi
│ ├── cpanfile
│ ├── cpanfile.snapshot
│ └── generate-cpanfile-snapshot.sh
├── docker-compose-ecs.yml
├── docker-compose.yml
└── task-definition.json
PSGIアプリケーションの作成
PSGIアプリケーションは定型文を返すだけのシンプルなもので,app.
の内容は次のとおりです。
my $app = sub {
return [
200,
[ 'Content-Type' => 'text/plain' ],
[ 'Hello, Plack!' ],
];
};
Dockerfileの作成
Dockerfile
の内容は次のとおりです。
FROM perl:5.30
RUN mkdir /app
WORKDIR /app
COPY cpanfile /app/cpanfile
COPY cpanfile.snapshot /app/cpanfile.snapshot
RUN cpanm Carton
COPY app.psgi /app/app.psgi
RUN carton install --deployment
CMD [ \
"carton", "exec", "--", "plackup", \
"--app", "app.psgi", "--server", "Starlet", \
"--port", "80", "--host", "0.0.0.0" \
]
Cartonをインストールし,plackup
Dockerfile
中ではcpanfile.
を変更したくないため,--deployment
オプション付きで起動しています。
docker-compose.ymlの作成と動作確認
手もとでも起動できることを確認します。
まず,docker-compose.
を作成します。
version: "3"
services:
app:
build: ./application
ports:
- "8000:80"
docker-compose.
をプロジェクトルートに配置した状態で,
$ docker-compose up
Building app
(省略)
Successfully built c471b02b6fdb
(省略)
app_1 | Plack::Handler::Starlet: Accepting connections at
http://0.0.0.0:80/
無事に動作しました。のちほどイメージをECRにpushするために,c471b02b6fdb
)
Amazon ECRへのイメージのpush
ECSでアプリケーションを動かすためには,
あらかじめECRにリポジトリを作成しておき,
$ docker tag \
イメージID \
AWSアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:latest
$ docker push \
AWSアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:latest
docker-compose-ecs.ymlの作成
次項でECSにデプロイするために,docker-compose.
を改変したdocker-compose-ecs.
を作成します。
version: "3"
services:
app:
image: AWSアカウントID.dkr.ecr.ap-northeast-1.amazonaw
s.com/リポジトリ名:latest(実際は1行)
ports:
- "80:80"
イメージをビルドする代わりに,awsvpc
インタフェースではコンテナポートとホストポートが一致している必要があるため,
- 注3)
- 執筆時点で最新のPlack 1.
0047を使用しています。 - 注4)
- 執筆時点で最新のStarlet 0.
31を使用しています。