【问题标题】:Parse environment variables in dockerfile entrypoint for mvn spring-boot:run为 mvn spring-boot:run 解析 dockerfile 入口点中的环境变量
【发布时间】:2020-06-27 18:22:14
【问题描述】:

我正在尝试在 docker 中运行 spring-boot 应用程序,但是当我尝试在 dockerfile 入口点中解析环境变量时,我收到以下错误:

无法打开 JDBC 连接以执行 DDL

我的 dockerfile 看起来像这样

FROM maven:3.6-jdk-8

COPY . /usr/src/api
WORKDIR /usr/src/api

ENV SPRING_URL ${SPRING_DATASOURCE_URL}
ENV SPRING_USERNAME ${SPRING_DATASOURCE_USERNAME}
ENV SPRING_PASSWORD ${SPRING_DATASOURCE_PASSWORD}

RUN mvn install:install-file \
     -Dfile=.mvn/wrapper/maven-wrapper.jar \
     -Dversion=1.0 \
     -Dpackaging=jar \
     -DgeneratePom=true \
     -DSPRING_DATASOURCE_URL=SPRING_URL \
     -DSPRING_DATASOURCE_USERNAME=SPRING_USERNAME \
     -DSPRING_DATASOURCE_PASSWORD=SPRING_PASSWORD

ENTRYPOINT mvn -DSPRING_DATASOURCE_URL=SPRING_URL -DSPRING_DATASOURCE_USERNAME=SPRING_USERNAME -DSPRING_DATASOURCE_PASSWORD=SPRING_PASSWORD spring-boot:run

环境变量来自 docker-compose 文件。我在跑步 docker-compose build,构建成功(包括正在通过的测试)和docker-compose -p 0.0.0.0:8080:8080 run api,失败并出现上述错误。

我的 docker-compose.yml 看起来像这样:

version: '3'
services:
  api:
    image: test/api:1.0
    build:
      context: .
      dockerfile: Dockerfile
    environment:
        - SPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL}
        - SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
        - SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}

问题在于我如何将环境变量解析到入口点。在 mvn 安装上,它似乎工作正常,但在 spring-boot:run 上却不行。入口点的shell形式是正确的命令吗?我应该如何解析变量?

【问题讨论】:

    标签: spring-boot maven docker docker-compose


    【解决方案1】:

    我按照https://spring.io/blog/2018/11/08/spring-boot-in-a-container 使用我的 application.properties 对应用程序进行 dockerize,如下所示:

    spring.datasource.url=${SPRING_DATASOURCE_URL}
    spring.datasource.username = ${SPRING_DATASOURCE_USERNAME}
    spring.datasource.password = ${SPRING_DATASOURCE_PASSWORD}
    

    然后我的 docker-compose.yml 保持不变,我的 Dockerfile 看起来像这样:

    FROM openjdk:8-jdk-alpine
    RUN addgroup -S spring && adduser -S spring -G spring
    USER spring:spring
    
    ARG DEPENDENCY=target/dependency
    ARG SPRING_DATASOURCE_URL
    ARG SPRING_DATASOURCE_USERNAME
    ARG SPRING_DATASOURCE_PASSWORD
    
    ENV SPRING_DATASOURCE_URL ${SPRING_DATASOURCE_URL}
    ENV SPRING_DATASOURCE_USERNAME ${SPRING_DATASOURCE_USERNAME}
    ENV SPRING_DATASOURCE_PASSWORD ${SPRING_DATASOURCE_PASSWORD}
    
    COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
    COPY ${DEPENDENCY}/META-INF /app/META-INF
    COPY ${DEPENDENCY}/BOOT-INF/classes /app
    
    EXPOSE 8080
    
    ENTRYPOINT ["java","- cp","app:app/lib/*","test.ApiApplication"]
    

    我发现这个页面在解释 dockerfile https://vsupalov.com/docker-arg-env-variable-guide/ 中的 ARG 和 ENV 时非常有用

    另外,为了让我原来的 dockerization 方法能够工作,我的 application.properties 和 docker-compose 保持不变,我的 dockerfile 是这样的:

    FROM maven:3.6-jdk-8
    
    COPY . /usr/src/api
    WORKDIR /usr/src/api
    ARG SPRING_DATASOURCE_URL
    ARG SPRING_DATASOURCE_USERNAME
    ARG SPRING_DATASOURCE_PASSWORD
    
    RUN mvn install:install-file \
         -Dfile=.mvn/wrapper/maven-wrapper.jar \
         -DgroupId=test.ApiApplication \
         -DartifactId=api \
         -Dversion=1.0 \
         -Dpackaging=jar \
         -DgeneratePom=true \
         -DSPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL} \
         -DSPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME} \
         -DSPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
    
    ENV SPRING_DATASOURCE_URL ${SPRING_DATASOURCE_URL}
    ENV SPRING_DATASOURCE_USERNAME ${SPRING_DATASOURCE_USERNAME}
    ENV SPRING_DATASOURCE_PASSWORD ${SPRING_DATASOURCE_PASSWORD}
    
    EXPOSE 8080
    
    ENTRYPOINT mvn -DSPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL} - DSPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME} - DSPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD} spring-boot:run
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多