【问题标题】:How to develop with Spring Boot in a Docker container and any IDE如何在 Docker 容器和任何 IDE 中使用 Spring Boot 进行开发
【发布时间】:2021-02-09 14:32:05
【问题描述】:

我使用 docker-compose 来启动不同的 Spring Boot 应用程序。

我的 docker 镜像是用这种Dockerfile 定义的:

FROM openjdk:8-jdk-alpine

ADD app.jar app.jar

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

但是,我希望使用 mvn spring-boot:run 之类的东西从调试和热重载功能中受益,而不依赖于特定的 IDE。

在不依赖特定 IDE 的情况下,在 Docker 容器中使用 Spring Boot 完成调试和热重载的最佳方法是什么?

注意事项:

  • 我的源文件被构建到一个 jar(使用 Maven)中,该 jar 被复制到包含我的 Docker 映像定义的不同位置;这意味着我的源文件不在 docker 映像中。
  • 我想在 Docker 容器中开发的原因是我的应用程序相互依赖,并且是在 docker-compose 环境中配置的,所以我无法轻松地在 docker 网络和环境之外单独运行一个应用程序。

我想在docker容器中挂载一个包含我的spring boot项目的卷,然后在容器中使用mvn spring-boot:run;但我不能阻止 maven 从 Internet 下载所有依赖项(我尝试指定包含 all my dependencieslocal repository 没有成功)。我想知道这是否是一个不错的解决方案以及如何使其发挥作用。

【问题讨论】:

    标签: java spring-boot docker maven


    【解决方案1】:

    您必须按照以下步骤在 docker 中构建和运行 Spring Boot 应用程序。

    第 1 步:在您的项目中创建一个名为 Dockerfile 的文件。

    第 2 步:在 Dockerfile 上编写以下代码

    # Use the official maven/Java 8 image to create a build artifact.
    # https://hub.docker.com/_/maven
    FROM maven:3.6-jdk-11 as builder
    
    # Copy local code to the container image.
    WORKDIR /app
    COPY pom.xml .
    COPY src ./src
    
    # Build a release artifact.
    RUN mvn package -DskipTests
    
    # Use AdoptOpenJDK for base image.
    # It's important to use OpenJDK 8u191 or above that has container support enabled.
    # https://hub.docker.com/r/adoptopenjdk/openjdk8
    # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
    FROM adoptopenjdk/openjdk11:alpine-slim
    
    # Copy the jar to the production image from the builder stage.
    COPY --from=builder /app/target/your-app-name*.jar /your-app-name.jar
    
    # Run the web service on container startup.
    CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/your-app-name.jar"]
    

    第 3 步:启动 Docker 桌面应用程序

    第 4 步:打开您的终端或 Windows PowerShell。然后进入项目目录。

    第6步:编写以下命令为您的应用程序创建映像(您必须有互联网连接才能下载所有依赖项)。

    docker build -f Dockerfile -t your-app-name .
    

    Step-7:镜像创建成功后。编写以下代码在 Docker 容器中运行镜像。

    docker run -p docker-port:app-port image-name
    

    【讨论】:

      【解决方案2】:

      按照您的思路,您可以尝试将依赖项从卷复制到项目容器中,然后以如下方式使用离线模式:

      FROM openjdk:8-jdk-alpine
      
      WORKDIR /app
      
      # copy the Project Object Model file
      COPY ./pom.xml ./pom.xml
      
      # copy your dependencies
      COPY app.jar app.jar
      
      # copy your other files
      COPY ./src ./src
      
      # Set fetch mode to offline to avoid downloading them from the internet
      RUN mvn dependency:go-offline
      

      显然也可以通过在 ~/.m2/settings.xml 文件中设置离线属性来全局配置离线模式,你可以设置它并复制你的 m2 文件并在运行容器时引用它

      <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                            https://maven.apache.org/xsd/settings-1.0.0.xsd">
        <offline>true</offline>
      </settings>
      
      mvn -Dmaven.repo.local=~/.m2/settings.xml ...
      

      您可以在此处找到更多信息:

      【讨论】:

        猜你喜欢
        • 2020-06-12
        • 2018-03-25
        • 2019-06-10
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2017-02-21
        • 2018-09-17
        相关资源
        最近更新 更多