运行 Docker 从 Docker 文件检查

Run Docker Inspect from Dockerfile

我正在创建一个简单的 HTML 并希望它显示构建 docker 容器的时间。我想使用 Docker inspect,因为 docker inspect 是来自 docker 容器内部的 运行 ] 文件?

我的 html 文件是

<!DOCTYPE html>
<html>
<body>

<h1>Welcome to Nginx Web Server</h1>

<p>Date/Time: <span id="datetime"></span></p>

<script>
var dt = new Date();
document.getElementById("datetime").innerHTML = (("0"+dt.getDate()).slice(-2)) +"."+ (("0"+(dt.getMonth()+1)).slice(-2)) +"."+ (dt.getFullYear()) +" "+ (("0"+dt.getHours()).slice(-2)) +":"+ (("0"+dt.getMinutes()).slice(-2));
</script>

<p>This server is running through Docker container deployed:</p>

</body>
</html>

我的 DOCKER 文件是

FROM nginx
COPY index.html /usr/share/nginx/html
EXPOSE 8080
RUN docker inspect -f '{{ .Created }}'

我不确定我是否理解您要测量的内容。但是,如果 docker 未安装 在您的映像 中,则您无法调用它。

可以使用某种形式的 docker-in-docker(例如 docker 图像)在容器中 运行 docker inspect。但是,我不认为这会做你想做的事 - 你无法获得尚未实际创建的图像的创建日期。

您可以改为使用 date 命令获取当前时间的时间戳:

$ date
Tue Mar  1 23:43:44 -03 2022

但是,我建议不要这样做。它会与 docker 的缓存进行奇怪的交互——该日期将被缓存用于后续构建,除非您更改 index.html.

Docker Inspect 可能会获得构建时间,但它

  1. 需要调用 docker 命令,引入过多的依赖性,因此 'heavy' 无法完成如此琐碎的任务。
  2. 只能运行镜像构建后。

更简单轻便的方法是在构建docker时替换html文件。

  1. 在 html 文件中定义要替换的占位符(要替换的唯一常量字符串)。
<!DOCTYPE html>
<html>
<body>

<h1>Welcome to Nginx Web Server</h1>

<p>Date/Time: <span id="datetime"></span></p>

<script>
var dt = new Date();
document.getElementById("datetime").innerHTML = (("0"+dt.getDate()).slice(-2)) +"."+ (("0"+(dt.getMonth()+1)).slice(-2)) +"."+ (dt.getFullYear()) +" "+ (("0"+dt.getHours()).slice(-2)) +":"+ (("0"+dt.getMinutes()).slice(-2));
</script>

<p>This server is running through Docker container deployed:</p>
<p>DATEPLACEHOLDER</p>
</body>
</html>
  1. date 变量替换占位符。
FROM nginx
COPY index.html /usr/share/nginx/html
EXPOSE 8080
RUN export NOW=$(date); sed -i "s/DATEPLACEHOLDER/$(NOW)/g" "/usr/share/nginx/html"

或者您可以使用RUN echo date > /tmp/date.txt,并在docker启动时将值代入html(可以在dockerfileCMD部分完成) .

但是,这种方法也有其缺点。即使 dockerfile 中没有任何更改,每次构建都会构建一个新图像。并且如果替换后还有其他重要步骤,docker构建缓存无效,导致构建时间和推送时间变长。