【问题标题】:Set today's date as environment variable将今天的日期设置为环境变量
【发布时间】:2020-12-29 13:15:57
【问题描述】:

我需要在我的 docker 容器中将今天的日期设置为环境变量。

我想要做的是获取今天的日期,这样我就可以使用它通过 Logstash 的 http_poller 插件调用一些 API。

我正在考虑的解决方案是使用命令date +%Y%m%d 获取今天的日期

如何在运行时将此命令的结果设置为环境变量?

【问题讨论】:

  • 您的意思是在构建镜像时还是在启动容器时?
  • 我想在运行容器时使用这个环境变量。
  • 您的问题有点令人困惑:Dockerfile 中设置变量意味着您要在构建时静态设置的时间戳 ,但是您的comments below 建议您希望在环境变量中设置当前日期在运行时?也许你在你真正想要实现的愿望的上下文上扩展了一点,因为这闻起来像 XY problem
  • @acran,你是对的,我可能会混淆他们,因为我是这项技术的新手,但正确的是,我正在寻找的是在运行时而不是构建时设置日期。我将尝试更新问题以避免混淆,非常欢迎任何更新建议。

标签: docker docker-compose environment-variables dockerfile


【解决方案1】:

ARG 应该是你要找的:

FROM base

# to be able to use in Dockerfile
ARG now

# to store the value as environment variable in the image
ENV build_date=$now

现在你可以用

# pass value explicitly
docker build --build-arg now="$(date +%Y%m%d)" .

# pass value from environment
export now="$(date +%Y%m%d)"
docker build --build-arg now .

这仍然需要在主机上运行date,因为不幸的是,在Dockerfile 内执行此操作是不可能的:

  • 在构建中执行任意命令的唯一方法是在RUN 语句中;但是
  • 将变量持久保存到映像/容器环境中的唯一方法是使用 ENV 语句,该语句只能使用构建外部的环境变量

您可以使用自定义 ENTRYPOINT 并从文件中将日期注入环境:

FROM base

RUN date +%Y%m%d > /build-timestamp
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh

entrypoint.sh:

#!/bin/bash

export BUILD_TIMESTAMP="$(cat /build-timestamp)"
exec "$@"

【讨论】:

  • 谢谢,但这不是我想要的,我想在 Dockerfile 内部而不是外部执行此操作。
  • 那么不幸的是没有办法做到这一点,因为ENV不能执行任意命令。我扩展了我的答案来解释这一点。
【解决方案2】:

所以根据你对我的评论的回答,如果你想在运行时设置变量,你需要在启动容器时注入它

✗ docker run -e TS=$(date +%Y%m%d) python:3.7-alpine env
TS=20201230
PYTHON_VERSION=3.7.9
HOME=/root

这里是 docker 文档的链接:https://docs.docker.com/engine/reference/run/#env-environment-variables

但是您将 Dockerfile 与容器混淆了。 Dockerfile 是构建镜像的定义。此图像是静态的。然后从这个基础镜像启动多个容器。

因此,如果您使用相同的图像启动 3 个容器,根据您的问题,您希望容器中有 3 个不同的日期。所以你明白了为什么你不能在 Dockerfile 中设置日期或命令。之前的 sn-p 会按照您的要求进行操作。

【讨论】:

    【解决方案3】:

    根据documentation ENV 只支持<key>=<value> 条目,我看没有办法用命令把它放在那里。我建议您将值放入某个文件中,然后在需要时读取它。或者,如果您有启动脚本,则可以使用 RUNexport VAR_NAME=<value> 添加到启动脚本中,以便在启动时将变量自动添加到环境中。

    【讨论】:

    • 建议的 RUN 解决方案似乎是唯一的方法,但我想我需要在容器内设置另一个 cron 作业以每天更新日期并运行启动脚本。
    • 如果您将export VAR_NAME=<value> 写入某个文件,例如/myvar.sh,然后在cron 和其他地方获取它会怎样? @M.Alsioufi
    • 这也可以是一个选项,但我认为在启动脚本本身中执行此操作更容易,因为无论如何我需要重新运行它才能读取变量的新值.否则我需要从myvar.sh 运行它,这会增加一个不必要的额外层。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多