【问题标题】:Dockerfile environment variables snafooDockerfile 环境变量 snafoo
【发布时间】:2020-02-10 15:41:26
【问题描述】:

我有以下 Dockerfile

FROM openjdk:8-jdk-alpine
RUN mkdir -p ./webpieces
COPY . ./webpieces/
COPY config/logback.cloudrun.xml ./webpieces/config/logback.xml
ENV PORT=8080
WORKDIR "/webpieces"
ENTRYPOINT ["./bin/authservice", "-http.port=:$PORT", "-hibernate.persistenceunit=production"]

但是,字符串 $PORT 最终出现在我的应用程序中,而不是 8080。我也尝试了命令行,但也无济于事。知道这里发生了什么吗?

我的意思是我使用

运行我的应用程序
docker run --env PORT=8080 -p 127.0.0.1:8080:8080 gcr.io/orderly-gcp/authservice

在启动时它说

-http.port following usages:
    (optional, default: :8080)Http host&port.  syntax: {host}:{port} or just :{port} to bind to all NIC ips on that host
            Value Parsed::$PORT foundKey:true foundValue:true

如果我绑定到所有端口,Value Parsed 部分通常会显示:8080。如果我硬编码为 :8080 而不是 :$PORT 或 :${PORT} ,它工作正常。我看不到让变量起作用。

谢谢, 院长

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    考虑以下 DockerFile:

    from ubuntu
    
    ENV PORT=8080
    
    ENTRYPOINT ["/bin/echo", "$PORT"]
    

    这将打印出“$PORT”,因为在使用数组 ENTRYPOINT 语法时不会扩展环境变量。您可以改为使用非数组语法,如下所示:

    from ubuntu
    
    ENV PORT=8080
    
    ENTRYPOINT /bin/echo $PORT
    

    这会打印出“8080”。

    【讨论】:

    • 天哪,太棒了!!!此外,来自 docker run 的命令行 PORT 是否会覆盖 ENV PORT?我不确定那个。我想我可以运行它看看,但我对我可能做错了没有那么自信:(所以我想我会问以防万一。
    • 我已经对其进行了测试,看起来命令行环境变量确实覆盖了使用 ENV 语法声明的变量。您可以找到有关变量优先级的更多信息here. 根据该问题,Dockerfile 的优先级最低,而通过 Docker Compose 定义的变量的优先级最高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2019-12-07
    • 2017-11-15
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多