docker 将今天的日期设置为环境变量

oyt4ldly  于 2023-04-11  发布在  Docker
关注(0)|答案(5)|浏览(123)

我需要将今天的日期设置为docker容器中的环境变量。
我想做的是获取今天的日期,这样我就可以用它来调用Logstash的http_poller插件的一些API。
我考虑的解决方案是使用命令date +%Y%m%d获取今天的日期
如何在运行时将此命令的结果设置为环境变量?

tvz2xvvm

tvz2xvvm1#

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 "$@"
0wi1tuuw

0wi1tuuw2#

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

✗ 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中设置日期或命令。前面的代码片段可以满足您的要求。

wbgh16ku

wbgh16ku3#

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

egdjgwm8

egdjgwm84#

我的解决方案是首先执行export命令,然后像这样运行服务启动

CMD export INSTALL_DATE=$(date +%s) && python3 /product/server.py
3vpjnl9f

3vpjnl9f5#

除了acran描述的解决方案外,使用ARG引入外部信息还有第二种解决方案。
您可以将日期写入文件,并在执行命令之前读取该文件的内容。

FROM alpine:latest

RUN (date +'%Y-%m-%d %R') > date.txt
CMD x=$(cat date.txt) && echo "The build time is: $x"

相关问题