前回
前回はMavenプロジェクトを作成しました。
目的
Mavenで標準的なWebプロジェクトを作り、
tomcatコンテナにデプロイして結合テストをしようと思った。
詰まったポイントを載せる。
今回のディレクトリ構成
ディレクトリ構成
├── docker
│ ├── app
│ │ └── Dockerfile
│ └── compose.yaml
│
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ ├── controller
│ │ │ │ └── Controller.java
│ │ │ ├── dao
│ │ │ │ └── Dao.java
│ │ │ └── model
│ │ │ └── Bean.java
│ │ ├── resources
│ │ └── webapp
│ │ ├── WEB-INF
│ │ └── index.jsp
│ └── test
│ ├── java
│ └── resources
└── target
│
└── test0219.war
Docker関連ファイル
シンプルすぎて公開するのも恥ずかしいですが…。
compose.yaml
services:
app:
ports:
- "8888:8080"
build:
context: ../
dockerfile: docker/app/Dockerfile
app/Dockerfile
FROM tomcat:9.0.86-jre17
COPY ./target/test0219.war /usr/local/tomcat/webapps/test0219.war
手順
-
docker compose up --build -d
でコンテナ起動 - コンテナ起動時にtarget/test0219.warファイルをデプロイ
-
http://http://localhost:8888/test0219/Controller
にアクセス
はまったポイント
はまったポイントを少し紹介。あまりはまらなかったようには思う。
web.xmlとアノテーションの衝突
永遠に404 Not Foundを吐く。
URLマッピングで指定したURLにアクセスしても404 Not Found. index.htmlを用意してファイル指定しないアクセスをしても404 Not Found.
解決手順
- tomcatとmavenのJREのバージョン違い確認
- URLの打ち間違い確認
- ログが出ていないか確認
解決
3番にて解決。
cat logs/catalina.2024-02-21.log
でログ確認。エラー発見。
java.lang.IllegalArgumentException:
The servlets named [X] and [Y] are both
mapped to the url-pattern [/url] which is not permitted
Controller.javaのアノテーション、web.xml内の両方でURLMappingを定義していたことによる実行時エラー。
Dockerfileからwarファイルが見えない問題
なんかごちゃごちゃいわれる
------
> [app 2/2] COPY ../target/test0219.war /usr/local/tomcat/webapps/test0219.war:
------
failed to solve: failed to compute cache key:
failed to calculate checksum of ref e1dfd113-d950-4603-8ce0-766b411be4a4::4qm6nry9ipcvfl89cs8pa0e9f:
failed to walk /var/lib/docker/tmp/buildkit-mount2629173263/target:
lstat /var/lib/docker/tmp/buildkit-mount2629173263/target:
no such file or directory
解決
Dockerfileから見て親階層は見えないっぽい。
最初のほうに書いたcompose.ymlのようにビルドコンテキストを設定することで回避。
今後
- dbコンテナを作成
- webコンテナを作成
- 開発用tomcatコンテナのメンテナンス(ホットデプロイ系)