MavenProjectでAmazon EC2 Container Registry (ECR)にプッシュしてみた。

2016.09.16

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。 ちょうど1ヶ月前、佐々木が以下のブログを上げていました。 【新機能】Amazon EC2 Container Registry (ECR)が東京リージョンにやってきました! | Developers.IO

実際に構築しているJavaのアプリケーションを組み込んだDocker ImageをAmazon ECRにPushするにはどうするんじゃい! と思い調べてみました。

下準備編(Java Application)

Mavenプロジェクトで簡単なSpring Frameworkを用いたアプリを書きました。

pom.xml

<!--?xml version="1.0" encoding="UTF-8"?-->
4.0.0

jp.classmethod
ecr_sample
0.0.1-SNAPSHOT
jar

ecr_sample
ECR Sample project for Spring Boot

org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
<!-- lookup parent from repository -->

UTF-8UTF-81.8


org.springframework.boot
spring-boot-starter-web

org.springframework.boot
spring-boot-starter-test
test


org.springframework.boot
spring-boot-maven-plugin

sampleController.java

package jp.classmethod;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
* Created by kajiwarayutaka on 2016/09/16.
*/
@RestController
public class sampleController {
@RequestMapping(value = "/" ,method = RequestMethod.GET)
public Response getMessage(){
Response response = new Response();
response.setMessage("Hello world.");
return response;
}
}
class Response {
private String message;
public String getMessage(){
return message;
}
public void setMessage(String message){
this.message = message;
}
}

上記のような感じでアプリケーションを実装し、レスポンスが返ってくるのを確認します。

$ curl localhost:8080
{"message":"Hello world."}

下準備編(Docker・ECR)

はじめにに記載した佐々木の記事をもとに、 レポジトリの作成とECRへのログインまで完了させてください。

docker-maven-plugin導入

Docker Image作成まで

pom.xml(pluginsの中に追記)

com.spotify
docker-maven-plugin
0.4.12


tag-install
package
build




openjdk:8-jre-alpine
classmethod/ecr_sample
["java", "-jar", "/${project.build.finalName}.jar"]
unix:///var/run/docker.sock


/
${project.build.directory}
${project.build.finalName}.jar

解説

unix:///var/run/docker.sock

まず、18行目ですが、これを記載することでUNIXドメインソケットを用いてDockerとやり取りをすることになります。 これを記載しないとTCPでのDockerとやり取りを行うことになります。

openjdk:8-jre-alpine
classmethod/ecr_sample
["java", "-jar", "/${project.build.finalName}.jar"]

次に15行目~17行目ですが、作成するDocker Imageの設定になります。 baseImageはその名の通り、ベースとなるDockerのイメージになります。 今回はJavaのアプリケーションということもあり、軽量のDockerImageであるalpineベースのJavaのイメージを用いました。 imageNameは作成するDockerのImage名になります。 entryPointはDockerfileのENTRYPOINTそのものです。

<br /><br />/
${project.build.directory}
${project.build.finalName}.jar

20行目からのresourcesはDocker Imageに何を含ませるかを指定しています。 Spring Bootのアプリケーションなので、jarを含ませるのみになっています。

<br />tag-install
package
build

6行目以降のexecutionで、mavenのpackage phaseで、このプラグインのbuildを行うといった記載をしています。 mavenのpackage phaseでDockerのImageが作られる事になります。

実行結果

$ mvn clean package
(中略)
[INFO] --- docker-maven-plugin:0.4.12:build (tag-install) @ ecr_sample ---
[INFO] Copying /Users/kajiwarayutaka/ProjectSand/ecr_sample/target/ecr_sample-0.0.1-SNAPSHOT.jar -> /Users/kajiwarayutaka/ProjectSand/ecr_sample/target/docker/ecr_sample-0.0.1-SNAPSHOT.jar
[INFO] Building image classmethod/ecr_sample
Step 1 : FROM openjdk:8-jre-alpine
---> 87ec762b5790
Step 2 : ADD /ecr_sample-0.0.1-SNAPSHOT.jar //
---> 8eca3bbd6c92
Removing intermediate container 4ded54ac8a49
Step 3 : ENTRYPOINT java -jar /ecr_sample-0.0.1-SNAPSHOT.jar
---> Running in ad67d9bbb3d5
---> f1fc360bb0dd
Removing intermediate container ad67d9bbb3d5
Successfully built f1fc360bb0dd
[INFO] Built classmethod/ecr_sample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.978 s
[INFO] Finished at: 2016-09-16T20:30:27+09:00
[INFO] Final Memory: 41M/323M
[INFO] ------------------------------------------------------------------------
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
classmethod/ecr_sample latest f1fc360bb0dd About a minute ago 121.9 MB

Docker Imageが作られたことがわかるかと思います。 一応Docker ImageにJavaのアプリケーションが組み込まれたことも確認しておきます。

$ docker run --name blog_ecr_sample -d -p 8080:8080 classmethod:ecr_sample
$ curl localhost:8080
{"message":"Hello world."}

こちらも問題がないことが確認できました。

Amazon EC2 Container Registry (ECR)にプッシュ

pom.xml(pluginsの中に追記)

<br />中略

tag-image
package
tag


classmethod/ecr_sample
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample



push-image
install
push


123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample




中略
true

解説

executionのところで、タグの付与とイメージのプッシュが増えています。 idがtag-imageがタグの付与、push-imageがイメージのプッシュになります。 タグの付与はdocker上のコマンド以下のように行うコマンドになります。

$ docker tag classmethod/ecr_sample:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample:latest

イメージのプッシュはdocker上のコマンドでは以下のようになります。

$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample:latest
true

最後のconfigurationの中に追加した上記の行ですが、このように書くことで、 このプラグインはAmazon ECRへログイン情報を用いてAmazon ECRへのプッシュを行うといったことが可能になっています。

実行結果

$ $(aws ecr get-login --region ap-northeast-1)
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
$ ls ~/.docker
config.json machine
$ mvn clean install

ECR_01fix

まとめ

なかなか長旅ではありましたが、これでビルドタスクと同時にDockerのImageをAmazon ECRにプッシュすると言ったことが可能なりました。