【问题标题】:How to use maven-docker on development-environment to avoid repeated download jars?如何在开发环境中使用 maven-docker 以避免重复下载 jar?
【发布时间】:2018-02-09 10:14:16
【问题描述】:

这是我的Dockerfile,但是如果我更改了java代码,然后在终端输入“docker-compose up -d --build”,maven会重新下载jar,如何避免重复下载?

Dockerfile:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn verify
ENTRYPOINT ["java","-jar","target/cloud-user.jar"]

docker-compose.yml:

version: "2"
services:
  cloud-nginx:
    build: cloud-nginx
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-nginx
    restart: always
    ports: ["80:80"]
  cloud-consul:
    image: consul:0.9.2
    command: consul agent -dev -client 0.0.0.0
  cloud-front:
    build: cloud-front
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-front
    restart: always
    volumes:
      - ./cloud-front/static:/app
  cloud-user:
    build: cloud-user
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-user
    restart: always
  mysql: 
    image: mysql:5.7.19
    hostname: mysql
    volumes: 
      - ./docker/mysql/data:/var/lib/mysql 
      - ./docker/mysql/conf:/etc/mysql/conf.d 
      - /etc/localtime:/etc/localtime
    ulimits: 
      nproc: 65535
    mem_limit: 1024m 
    restart: always 
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"

我精简了我的测试项目,然后使用maven的spring-boot插件

mvn spring-boot:run

要启动项目,现在先挂载 .m2 文件夹,然后运行 ​​mvn 命令。 但是我改了java源码后,devtools没有自动加载,怎么解决?

这是我的 Dockerfile/docker-compose.yml :

Dockerfile:

version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/src:/app/src
    ports:
      - "8080:8080"

docker-compose.yml:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]

【问题讨论】:

  • 将本地缓存 $HOME/.m2/repository 挂载到您的 Docker 映像中...但是为什么要在 Docker 容器中构建呢?为什么不简单地通过 Dockerfile 将最终生成的 war/jar 文件复制到 Docker 容器中?
  • @khmarbaise 本来想在容器中添加jar并运行,但是开发过程中代码变化比较频繁,过程显得过于繁琐。然后想着把$HOME/.m2/repository作为数据卷放到容器里,但是试了很多次,在执行mvn verify之前没有弄清楚如何将.m2目录挂载到容器中。
  • @khmarbaise 非常感谢您

标签: java maven docker docker-compose development-environment


【解决方案1】:

已解决,我将目标文件夹挂载到容器中,是可以自动加载的,就是最终的dockerfile和docker-compose.yml,当然,在生产环境中,我们可以不写:

Dockerfile:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]

docker-compose.yml

version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/target:/app/target
    ports:
      - "8080:8080"
      - "5005:5005"

pom.xml:

    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>cn.codeforfun.Application</mainClass>
          <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments>
        </configuration>
      </plugin>
    </plugins>

【讨论】:

  • 建议说明。使用 docker-compose,您可以为 m2 使用一个命名卷,因此您可以使用一个卷:(volumes:\n -m2data:/root/.m2/repository),而不是挂载自己的 .m2 目录,然后在一个卷部分指定 m2data。当您上下组合时,它将保持音量不变,因此每次连续启动都会重用您的依赖项。您可以手动删除卷,也可以在 docker-compose down 命令中添加 -v。希望我在没有格式的情况下有意义。
  • @NielsBechNielsen 非常感谢。你的建议给了我很大的启发,我想我需要尝试更多次。
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2016-12-11
相关资源
最近更新 更多