【问题标题】:Spring boot - Jasypt - Dockerfile - Build - how to pass environemnt variablesSpring boot - Jasypt - Dockerfile - Build - 如何传递环境变量
【发布时间】:2021-09-15 07:38:54
【问题描述】:

我正在关注关于如何使用 docker 进行 spring boot 的 spring io 文章。所以使用 Dockerfile https://github.com/spring-guides/top-spring-boot-docker/tree/main/demo

问题:测试失败

由:java.lang.IllegalArgumentException 引起 PropertyPlaceholderHelper.java:178

我的应用程序有一些环境变量依赖

jasypt.encryptor.password=${mjasypt.secret}
jasypt.encryptor.algorithm=${mjasypt.algo}

我正在运行如下构建

docker build --build-arg DEPENDENCY=build/dependency -t ....

我在 dockerfile 中尝试了 3 个新的环境参数

ARG CBS=a
ARG JSP=b
ARG JSA=c

并更新入口点

ENTRYPOINT ["java","-noverify","-XX:TieredStopAtLevel=1","-cp","app:app/lib/*","-Dspring.main.lazy-initialization=true","-Dv1=${CBS}", "-Dv2=${JSP}", "-Dv3=${JSA}",...

和运行命令一样,但没有工作

docker build --build-arg DEPENDENCY=build/dependency --build-arg CBS=.. --build-arg JSP=..1 --build-arg JSA=P..ES -t ...

我在 dockerfile 中添加了 RUN echo ${CBS} 并且我可以看到我从 docker build 传递的值(不是 a),但是我怎么知道它是否也在 ENTRY POINT 中

更正: Dockerfile 是多阶段的,也有

运行 --mount=type=cache,target=/root/.gradle ./gradlew clean build

在运行测试时如何将值传递给该命令

【问题讨论】:

    标签: spring-boot docker


    【解决方案1】:

    Dockerfile 中的ARG 仅在构建阶段可用。

    当您想将其作为容器运行时,ARG 值将不可用,但 ENV 将可用。这意味着您不能直接访问ENTRYPOINT 中的这些值(在CMD 中也不可用)。您可以阅读this similar question 了解更多信息。

    如果您想使用构建参数 (ARG) 将环境参数传递给容器,简单的解决方案是执行以下操作:

    ARG CBS=a
    ARG JSP=b
    ARG JSA=c
    
    ENV CBS_ENV=$CBS
    ENV JSP_ENV=$JSP
    ENV JSA_ENV=$JSA
    

    然后更新您的ENTRYPOINT

    ENTRYPOINT ["java","-noverify","-XX:TieredStopAtLevel=1","-cp","app:app/lib/*","-Dspring.main.lazy-initialization=true","-Dv1=${CBS_ENV}", "-Dv2=${JSP_ENV}", "-Dv3=${JSA_ENV}",...
    

    如果您的值仅在容器运行时使用,那么您可以完全删除ARG,并在容器启动时将其作为参数传递。阅读this similar question了解更多信息。

    例如:

    docker run -e CBS='a' -e JSP='b' -e JSA='c' mynicevue
    

    更新:

    ARG CBS=a
    ARG JSP=b
    ARG JSA=c
    
    # First stage
    FROM openjdk:8-jdk-alpine AS build
    
    WORKDIR /workspace/app
    
    RUN --mount=type=cache,target=/root/.gradle ./gradlew clean build
    
    RUN mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar)
    
    # Second stage
    FROM openjdk:8-jdk-alpine
    
    ARG DEPENDENCY=/workspace/app/build/dependency
    
    ARG CBS
    ARG JSP
    ARG JSA
    
    ENV CBS=$CBS
    ENV JSP=$JSP
    ENV JSA=$JSA
    
    COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
    
    COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
    
    COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app 
    
    ENTRYPOINT ["java", "-cp", "app:app/lib/*", "hello.Application", "-Dv1=${CBS}", "-Dv2=${JSP}", "-Dv3=${JSA}"]
    

    【讨论】:

    • 我的出发点是“docker build ....”,你能告诉我怎么做吗?示例 dockerfile FROM openjdk:8-jdk-alpine AS build WORKDIR /workspace/app RUN --mount=type=cache,target=/root/.gradle ./gradlew clean build RUN mkdir -p build/dependency && (cd build/依赖项;jar -xf ../libs/*.jar) FROM openjdk:8-jdk-alpine ARG DEPENDENCY=/workspace/app/build/dependency COPY --from=build ${DEPENDENCY}/BOOT-INF/lib / app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp ","app:app/lib/*","hello.Application"]
    • 如果您只需要使用docker build 并且您有多阶段构建,则需要在任何FROM 命令之前在全局范围内定义ARG。并在您要使用该值的阶段,再次定义ARG。其余的和我的回答类似。
    • 我用您在评论中发送的 Dockerfile 内容更新了我的答案。我尝试添加您在原始问题中的 3 个环境变量。希望这会有所帮助。
    • 我接受这个作为答案,因为它非常有帮助(尽管我认为命令也可能是我的错)
    猜你喜欢
    • 2018-04-27
    • 2021-05-19
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2018-02-06
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多