diff --git a/doc/functions.xml b/doc/functions.xml
index 3cfc6884bd26..31b40fb084a3 100644
--- a/doc/functions.xml
+++ b/doc/functions.xml
@@ -638,6 +638,45 @@ buildImage {
pkgs.cacert to contents.
+
+
+ Impurely Defining a Docker Layer's Creation Date
+
+ Because dates are an impurity, by default
+ buildImage will use a static date of one
+ second past the UNIX Epoch. This can be a bit frustrating when
+ listing docker images in the CLI:
+
+
+
+ If you want to trade the purity for a better user experience,
+ you can set created to
+ now.
+
+
+
+ and now the Docker CLI will display a reasonable date and
+ sort the images as expected:
+
+
+
diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix
index 93b715659eb0..0cee1dd2916f 100644
--- a/pkgs/build-support/docker/default.nix
+++ b/pkgs/build-support/docker/default.nix
@@ -450,11 +450,18 @@ rec {
baseName = baseNameOf name;
# Create a JSON blob of the configuration. Set the date to unix zero.
- baseJson = writeText "${baseName}-config.json" (builtins.toJSON {
- inherit created config;
- architecture = "amd64";
- os = "linux";
- });
+ baseJson = let
+ pure = writeText "${baseName}-config.json" (builtins.toJSON {
+ inherit created config;
+ architecture = "amd64";
+ os = "linux";
+ });
+ impure = runCommand "${baseName}-config.json"
+ { buildInputs = [ jq ]; }
+ ''
+ jq ".created = \"$(TZ=utc date --iso-8601="seconds")\"" ${pure} > $out
+ '';
+ in if created == "now" then impure else pure;
layer =
if runAsRoot == null
@@ -577,7 +584,7 @@ rec {
currentID=$layerID
while [[ -n "$currentID" ]]; do
layerChecksum=$(sha256sum image/$currentID/layer.tar | cut -d ' ' -f1)
- imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"${created}\"}] + .")
+ imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"$(jq -r .created ${baseJson})\"}] + .")
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= [\"sha256:$layerChecksum\"] + .")
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$currentID/layer.tar\"] + .")