Skip to content

fix: substitute devcontainer.json build args into Dockerfile ARG variables#490

Open
kacpersaw wants to merge 4 commits intomainfrom
kacpersaw/fix-dockerfile-arg-build-args
Open

fix: substitute devcontainer.json build args into Dockerfile ARG variables#490
kacpersaw wants to merge 4 commits intomainfrom
kacpersaw/fix-dockerfile-arg-build-args

Conversation

@kacpersaw
Copy link

Fixes #455

Problem

When devcontainer.json specifies build args (e.g. "VARIANT": "3.11-bookworm") and the Dockerfile uses ARG VARIANT + FROM ...${VARIANT}, envbuilder fails because ImageFromDockerfile and UserFromDockerfile don't accept external build args — they only use ARG defaults from the Dockerfile itself.

Changes

  • ImageFromDockerfile — Added buildArgs []string parameter. Build args now override ARG defaults and supply values for ARGs without defaults.
  • UserFromDockerfile — Added buildArgs []string parameter. Collects ARG values with build arg overrides and substitutes them into stage.BaseName before parsing image refs.
  • Updated all call sites to pass build args through.
  • Added tests for both override and no-default cases.

…ables (#455)

ImageFromDockerfile and UserFromDockerfile now accept external build args
from devcontainer.json, allowing them to override ARG defaults and supply
values for ARGs without defaults. This fixes the error when a Dockerfile
uses ARG VARIANT + FROM ...${VARIANT} with the value provided in
devcontainer.json build.args.
@kacpersaw kacpersaw marked this pull request as ready for review February 18, 2026 13:23
- Change buildArgs parameter from []string to map[string]string
- Add exported BuildArgsMap helper for call-site conversion
- Use child.Next.Value instead of fragile child.Original slicing
- Use strings.Cut instead of strings.Contains + SplitN
- Return ProcessWord errors instead of silently swallowing them
- Add UserFromDockerfile_BuildArgs test with registry
- Add MissingBuildArgUsesEmpty test case
Comment on lines 248 to 251
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One point I'd like to raise here: if you try to build this Dockerfile it will probably error with something like

ERROR: failed to build: failed to solve: failed to parse stage name "python:1-": invalid reference format

whereas a different Dockerfile would probably not fail e.g.

FROM alpine:3.18
ARG VARIANT
RUN echo "foo-${VARIANT}" > /tmp/test.txt && cat /tmp/test.txt
EOF

Docker also seems to have some kind of "special-case" warning about this e.g.

�[0m - InvalidDefaultArgInFrom: Default value for ARG alpine:${VARIANT} results in empty or invalid base image name (line 2)

The test asserted that an ARG without a default used in FROM would
produce an empty substitution (e.g. python:1-), but in practice
Docker would error on such an invalid reference. Remove the
unrealistic test case.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Docker ARG parsing doesn't work

2 participants

Comments