LoginSignup
0
0

More than 3 years have passed since last update.

mavenでflywayのjarを作成してdocker-maven-pluginでdocker build(migrate)する

Posted at

だいぶはまったのでまとめる。

使用するdocker-maven-plugin

docker-maven-pluginは以下の2つからリリースされている。

今回はfabric8ioのdocker-maven-pluginを使用した。

docker buidするには

buidには2つのモードがある。

  1. pom.xmlにfromやcmdを記述し、buid方法
  2. pom.xmlから別のDockerfileを参照し、buidする方法

1に関しては以下の通り。

<configuration>
  <images>
    <image>
      <alias>service</alias> 
      <name>fabric8/docker-demo:${project.version}</name>

      <build> 
         <from>java:8</from> 
         <assembly>
           <descriptor>docker-assembly.xml</descriptor> 
         </assembly>
         <cmd> 
            <shell>java -jar /maven/service.jar</shell>
         </cmd>
      </build>
    </image>
</configuration>

2は以下のようになる。

        <configuration>
          <images>
            <image>
              <name>${project.name}</name>
              <build>
                <dockerFileDir>${project.basedir}</dockerFileDir>
              </build>
            </image>
          </images>
        </configuration>

2のやり方を選定した。
理由としては、

  • migrateの際に、sqlファイルがないといけないが、1のやり方だとCOPYができないから。

project直下にDockerfileを作成し、buid参照先を指定する。

project/
  ┝src
  ┝Dockerfile
  ┝pom.xml

Dockerfileを使ってmigrateを行うには

Dockerfile
FROM amazoncorretto:11-alpine
COPY maven /maven/jar/
COPY ${flyway.sqldir}/V1__Initialize.sql sql/
COPY ${flyway.confdir}/flyway.conf conf/
CMD java -XX:MaxRAMPercentage=75 -jar \
    maven/jar/${project.name}-${project.version}.jar \
    -url=jdbc:mysql://host.docker.internal:${db.port}/${db.name} \
    -user=${db.username} \
    -password=${db.password} \
    -configFiles=conf/flyway.conf \
    -jarDirs="" \
    migrate

ポイント

①作成したjarは2階層目に配置する。

COPY maven /maven/jar/
COPY ${flyway.sqldir}/V1__Initialize.sql sql/
COPY ${flyway.confdir}/flyway.conf conf/

flywayの仕組みとして、sqlやconfファイルを探しに行く時2階層上のフォルダを見に行く。
以下のようなディレクトリ構造にする。

/
├sql
│ └V1__Initialize.sql
├conf
│ └flyway.conf
├maven
  └jar
    └flyway.jar

②sqlやconfファイルをコピーする時はpom.xmlのpropertiesを活用する。

pom.xml
...
  <properties>
    <flyway.sqldir>${project.basedir}/src/main/resources/db/migration</flyway.sqldir>
    <flyway.confdir>${project.basedir}/src/local/resources</flyway.confdir>
  </properties>
...

Dockerfileに直接記述した場合、意図しないパスを参照してしまう。
propertiesで宣言して参照するパスを固定化する。


③flywayのjarを作成する時に著名ファイルを取り除く

pom.xml
...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
...

上記のプラグインを導入する。これがないとSecurityExceptionが発生する。

docker runでmigrate実行

mvn package docker:buid

dockerImageが作成される。

docker run ${project.name}

でmigrateが実行される。


参考文献

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