我需要将今天的日期设置为docker容器中的环境变量。我想做的是获取今天的日期,这样我就可以用它来调用Logstash的http_poller插件的一些API。我考虑的解决方案是使用命令date +%Y%m%d获取今天的日期如何在运行时将此命令的结果设置为环境变量?
date +%Y%m%d
tvz2xvvm1#
ARG应该是你要找的:
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内部无法执行此操作:
date
Dockerfile
RUN
ENV
您可以使用自定义的ENTRYPOINT坚韧并从文件中将数据注入到环境中:
ENTRYPOINT
FROM base RUN date +%Y%m%d > /build-timestamp COPY entrypoint.sh /entrypoint.sh ENTRYPOINT /entrypoint.sh
entrypoint.sh:
entrypoint.sh
#!/bin/bash export BUILD_TIMESTAMP="$(cat /build-timestamp)" exec "$@"
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中设置日期或命令。前面的代码片段可以满足您的要求。
wbgh16ku3#
根据文档ENV只支持<key>=<value>条目,我认为没有办法用命令将其放置在那里。我建议您将值放入某个文件中,然后在需要时读取它。或者,如果您有启动脚本,可以使用RUN将export VAR_NAME=<value>添加到启动脚本中,以便在启动时自动将变量添加到环境中。
<key>=<value>
export VAR_NAME=<value>
egdjgwm84#
我的解决方案是首先执行export命令,然后像这样运行服务启动
CMD export INSTALL_DATE=$(date +%s) && python3 /product/server.py
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"
5条答案
按热度按时间tvz2xvvm1#
ARG
应该是你要找的:现在你可以用
这仍然需要在主机上运行
date
,因为不幸的是,在Dockerfile
内部无法执行此操作:RUN
语句中;但是ENV
语句,该语句只能使用构建外部的环境变量您可以使用自定义的
ENTRYPOINT
坚韧并从文件中将数据注入到环境中:entrypoint.sh
:0wi1tuuw2#
所以根据你对我的评论的回答,如果你想在运行时设置变量,你需要在启动容器时注入它
以下是docker文档的链接:https://docs.docker.com/engine/reference/run/#env-environment-variables
但是你混淆了Dockerfile和容器。Dockerfile是构建镜像的定义。这个镜像是静态的。然后你从这个基础镜像启动多个容器。
因此,如果您使用相同的图像启动3个容器,根据您的问题,您希望容器中有3个不同的日期。因此,您可以看到为什么无法在Dockerfile中设置日期或命令。前面的代码片段可以满足您的要求。
wbgh16ku3#
根据文档
ENV
只支持<key>=<value>
条目,我认为没有办法用命令将其放置在那里。我建议您将值放入某个文件中,然后在需要时读取它。或者,如果您有启动脚本,可以使用RUN
将export VAR_NAME=<value>
添加到启动脚本中,以便在启动时自动将变量添加到环境中。egdjgwm84#
我的解决方案是首先执行export命令,然后像这样运行服务启动
3vpjnl9f5#
除了acran描述的解决方案外,使用ARG引入外部信息还有第二种解决方案。
您可以将日期写入文件,并在执行命令之前读取该文件的内容。