【问题标题】:Spring Boot and Docker-compose setting argumentsSpring Boot 和 Docker-compose 设置参数
【发布时间】:2018-11-28 15:28:49
【问题描述】:

我可能是 docker 领域的新手,并尝试将我的 Spring-Boot 项目与 docker 和 docker-compose 结合起来,但不知何故 docker-compose 不起作用。

我正在使用 spring boot 文档中描述的 com.spotify maven 插件。 我可以使用 spotify 插件构建和运行 docker 映像,也可以使用 docker 命令从命令行构建和运行 docker 映像,但当我尝试使用 docker-compose up 时则不行。

在这里我总是收到错误“错误:无效或损坏的 jarfile /app.jar”。

我确定它与从 spotify 插件传递到 docker 命令的 ARG JAR_FILE 有关。 我不知道如何在 docker-compose.yml 中设置此 ARG_FILE,以便我能够从 docker-compose up 开始,也可以使用 spotify 插件仅运行 docker 映像。

这是我的设置:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>eu.devroyal</groupId>
<artifactId>someProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>someProject</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <postgres.version>42.2.2</postgres.version>
    <docker.image.prefix>eu.devroyal</docker.image.prefix>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>



    <!--dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgres.version}</version>
        <scope>runtime</scope>
    </dependency-->
    <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgres.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.7</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.196</version>

    </dependency>


</dependencies>

<build>
    <finalName>someProject-app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <repository>${docker.image.prefix}/${project.artifactId}</repository>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8188

docker-compose.yml:

 version: '3'
services:
   web:
        environment:
            - JAR_FILE=target/someProject-app.jar
        build: ./
        ports:
            - "8188:8188"

【问题讨论】:

    标签: java maven docker spring-boot docker-compose


    【解决方案1】:

    在构建dockerfile的时候,一定要加上这个参数

    docker build --build-arg JAR_FILE=jar_file_path .

    在 docker-compose.yml 中的替代方法

    version: '3'
    services:
       web:
          build:
            context: ./
            args:
              JAR_FILE: jar_file_path
          ports:
            - "8188:8188"
    

    【讨论】:

    • 谢谢。这给了我mssing提示。我将此标记为正确答案。您可以在 docker-compose.yml 文件中执行相同的操作。版本:'3' 服务:网络:构建:上下文:./ args:JAR_FILE:目标/bosstools-app.jar 端口:-“8188:8188”
    【解决方案2】:

    我会推荐这种方式

    FROM openjdk:8-jdk-alpine
    VOLUME /tmp
    COPY target/someproject-app.jar /app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    EXPOSE 8188
    

    当 Dockerfile 被执行时,目标中的相应 jar 将被复制。

    【讨论】:

    • 为什么会这样?
    • 没有得到 .能详细点吗?
    • 是的,我知道这个,。但我正在寻找一种将 docker-compose.yml 文件中的参数 JAR_FILE 传递给 cocker 命令的方法。
    • 你可以使用像 'ENV SPRING_PROFILES_ACTIVE dev' 这样的 ENV 变量,并从 docker-compose.yml 文件中传递值
    猜你喜欢
    • 2021-07-09
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2022-06-15
    • 2021-05-14
    • 2017-04-08
    相关资源
    最近更新 更多