LoginSignup
0
0

Mavenの動的WebプロジェクトをDockerのtomcatコンテナにデプロイして結合テスト

Posted at

前回

前回は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

手順

  1. docker compose up --build -dでコンテナ起動
  2. コンテナ起動時にtarget/test0219.warファイルをデプロイ
  3. http://http://localhost:8888/test0219/Controllerにアクセス

はまったポイント

はまったポイントを少し紹介。あまりはまらなかったようには思う。

web.xmlとアノテーションの衝突

永遠に404 Not Foundを吐く。

URLマッピングで指定したURLにアクセスしても404 Not Found. index.htmlを用意してファイル指定しないアクセスをしても404 Not Found.

解決手順

  1. tomcatとmavenのJREのバージョン違い確認
  2. URLの打ち間違い確認
  3. ログが出ていないか確認

解決

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コンテナのメンテナンス(ホットデプロイ系)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0