この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。 ちょうど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
まとめ
なかなか長旅ではありましたが、これでビルドタスクと同時にDockerのImageをAmazon ECRにプッシュすると言ったことが可能なりました。