Merge pull request #117603 from lbpdt/fix/docker-tools-layered-image-env
dockerTools.streamLayeredImage: resolve duplicate env vars
This commit is contained in:
commit
363d7c86b0
@ -221,6 +221,21 @@ import ./make-test-python.nix ({ pkgs, ... }: {
|
|||||||
assert "FROM_CHILD=true" in env, "envvars from the child should be preserved"
|
assert "FROM_CHILD=true" in env, "envvars from the child should be preserved"
|
||||||
assert "LAST_LAYER=child" in env, "envvars from the child should take priority"
|
assert "LAST_LAYER=child" in env, "envvars from the child should take priority"
|
||||||
|
|
||||||
|
with subtest(
|
||||||
|
"Ensure inherited environment variables of layered images are correctly resolved"
|
||||||
|
):
|
||||||
|
# Read environment variables as stored in image config
|
||||||
|
config = docker.succeed(
|
||||||
|
"tar -xOf ${examples.environmentVariablesLayered} manifest.json | ${pkgs.jq}/bin/jq -r .[].Config"
|
||||||
|
).strip()
|
||||||
|
out = docker.succeed(
|
||||||
|
f"tar -xOf ${examples.environmentVariablesLayered} {config} | ${pkgs.jq}/bin/jq -r '.config.Env | .[]'"
|
||||||
|
)
|
||||||
|
env = out.splitlines()
|
||||||
|
assert (
|
||||||
|
sum(entry.startswith("LAST_LAYER") for entry in env) == 1
|
||||||
|
), "envvars overridden by child should be unique"
|
||||||
|
|
||||||
with subtest("Ensure image with only 2 layers can be loaded"):
|
with subtest("Ensure image with only 2 layers can be loaded"):
|
||||||
docker.succeed(
|
docker.succeed(
|
||||||
"docker load --input='${examples.two-layered-image}'"
|
"docker load --input='${examples.two-layered-image}'"
|
||||||
|
@ -202,7 +202,9 @@ def overlay_base_config(from_image, final_config):
|
|||||||
# Preserve environment from base image
|
# Preserve environment from base image
|
||||||
final_env = base_config.get("Env", []) + final_config.get("Env", [])
|
final_env = base_config.get("Env", []) + final_config.get("Env", [])
|
||||||
if final_env:
|
if final_env:
|
||||||
final_config["Env"] = final_env
|
# Resolve duplicates (last one wins) and format back as list
|
||||||
|
resolved_env = {entry.split("=", 1)[0]: entry for entry in final_env}
|
||||||
|
final_config["Env"] = list(resolved_env.values())
|
||||||
return final_config
|
return final_config
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user