はじめに
Windows10&DockerDesktopを利用している環境にてSpringBootのwarファイルをLibertyにデプロイした流れを説明します。
以下記事のWindowsバージョンです。
環境情報
- Windows 10
- DockerDesktop
- Eclipse(STS)
warファイルの準備
Eclipseでwarファイルを生成しました。スタータープロジェクトをMavenで作成しました。
└── demo
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── demo
│ │ │ ├── DemoApplication.java
│ │ │ ├── Hello.java
│ │ │ └── ServletInitializer.java
│ │ └── resources
│ │ ├── application.properties
│ │ ├── static
│ │ └── templates
│ └── test
│ └── java
│ └── com
│ └── example
│ └── demo
│ └── DemoApplicationTests.java
└── target
├── classes
│ ├── application.properties
│ └── com
│ └── example
│ └── demo
│ ├── DemoApplication.class
│ ├── Hello.class
│ └── ServletInitializer.class
├── demo-0.0.1-SNAPSHOT
│ ├── META-INF
│ └── WEB-INF
│ ├── classes
│ │ ├── application.properties
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.class
│ │ ├── Hello.class
│ │ └── ServletInitializer.class
│ └── lib
├── generated-sources
│ └── annotations
├── generated-test-sources
│ └── test-annotations
├── maven-archiver
│ └── pom.properties
├── maven-status
│ └── maven-compiler-plugin
│ ├── compile
│ │ └── default-compile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ └── testCompile
│ └── default-testCompile
│ ├── createdFiles.lst
│ └── inputFiles.lst
├── surefire-reports
│ ├── com.example.demo.DemoApplicationTests.txt
│ └── TEST-com.example.demo.DemoApplicationTests.xml
└── test-classes
└── com
└── example
└── demo
└── DemoApplicationTests.class唯一作成したHello.javaは以下
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping public class Hello { @RequestMapping("hello") private String hello() { return "HelloWorld"; } }
この状態でpom.xmlにて右クリックし「maven install」を行えば以下のようにwarファイルが作成されます。
[INFO] Building war: C:\XX\demo\target\demo-0.0.1-SNAPSHOT.war
Libertyコンテナを起動する
「websphere-liberty」イメージを利用します。
ポイントは今回のwarファイルを「/config/dropins/」配下に配置することです。これによって自動デプロイされます。
以下はPowerShellのワンライナー。ポートは80をアクセスすればコンテナ内の9080に転送するようにしています。
> docker run -d -p 80:9080 -v C:\Users\XX\..\demo-0.0.1-SNAPSHOT.war:/config/dropins/app.war websphere-liberty
ちなみにコンテナ内に確認すると以下のプロセスが起動しています。
default@1f249f2fd45b:/$ ps x
PID TTY STAT TIME COMMAND
1 ? SLsl 1:10 /opt/ibm/java/jre/bin/java -javaagent:/opt/ibm/wlp/bin/tools/ws-javaagent.jar -Djava.awt.head .. bash
動作検証を行う
今回は「app.war」と名前を変えて配置したので「/hello」と合わせて以下のURLにアクセスすると確認できます。
$ curl http://localhost/app/hello Hello World!
ブラウザに同URLを入れても同じ結果が確認できます。
app本体やapp配下の別のパスを入れても404でエラーとなり
$ curl http://localhost/app Error 404: $ curll http://localhost/app/a Error 404:
そもそも別のパスを入れればLivertyのエラー画面になります。
$ curl http://localhost/hoge <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ... content="WebSphere Application Server Version V8.5 Liberty Profile - Context Root Not Found" /> ...
ちなみに
同warファイルをVisualStudioCodeで作成して配置すると以下エラーとなり詰まったので今回はEclipseを採用しました。
$ curl http://localhost/app/hello Error 404: javax.servlet.ServletException: java.io.FileNotFoundException: SRVE0190E: File not found: /hello
終わりに
冒頭のリンク先では以下のようにwarファイルの配置をワンクッションおいてましたがDockerDesktopではそのまま配置できます。
ダウンロードしたサンプルアプリケーションを、PC 環境(例: /c/Users/shimizu/ci.docker.tutorials/app/ServletApp.war)から仮想マシン(default)(例: /tmp/ServletApp.war)にコピーします。
以上、ご参考になれば幸いです。