devcontainer icon indicating copy to clipboard operation
devcontainer copied to clipboard

Issue with hyphens in build args used in FROM

Open sysadmiral opened this issue 3 years ago • 3 comments

Hi thanks for a great tool.

I'm taking the Dockerfile and devcontainer.json from here.

The ARG for setting the ${VARIANT} contains a dash which seems to create a problem with the passing of command-line args in this script.

Here is the error I get:

docker: invalid reference format: repository name must be lowercase.
See 'docker run --help'.

and the debug output is:

Using workspace -v
[DEBUG] CONFIG_DIR: ./.devcontainer
[DEBUG] CONFIG_FILE: devcontainer.json
[DEBUG] CONFIG: 
{
        "name": "Node.js",
        "build": {
                "dockerfile": "Dockerfile",
                "args": { "VARIANT": "16-bullseye" }
        },

        "customizations": {
                "vscode": {
                        "extensions": [
                                "dbaeumer.vscode-eslint"
                        ]
                }
        },



        "remoteUser": "node"
}
[DEBUG] DOCKER_FILE: /home/amo_chumber/scratch/devcontainer-test/.devcontainer/Dockerfile
[DEBUG] REMOTE_USER: node
[DEBUG] ARGS: --build-arg VARIANT="16-bullseye"
[DEBUG] SHELL: null
[DEBUG] PORTS: 
[DEBUG] ENVS: 
[DEBUG] WORK_DIR: /workspace
[DEBUG] MOUNT:  --mount type=bind,source=-v,target=/workspace
Building and starting container
invalid reference format
[DEBUG] DOCKER_IMAGE_HASH: Sending build context to Docker daemon  4.096kB
Step 1/2 : ARG VARIANT=16-bullseye
Step 2/2 : FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT}
docker: invalid reference format: repository name must be lowercase.
See 'docker run --help'.

I suspect this is a bash-ism with some quoting...

sysadmiral avatar Sep 07 '22 22:09 sysadmiral

yeah definitely a bash-ism:

amo_chumber@cloudshell:~/scratch/devcontainer-test$ docker build -f .devcontainer/$(cat .devcontainer/devcontainer.json | grep -v // | jq -r '.build.dockerfile') $(cat .devcontainer/devcontainer.json | grep -v // | jq -r '.build.args | to_entries? | map("--build-arg \(.key)=\"\(.value)\"")? | join(" ")') .
Sending build context to Docker daemon  4.608kB
Step 1/2 : ARG VARIANT=16-bullseye
Step 2/2 : FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT}
invalid reference format

vs

amo_chumber@cloudshell:~/scratch/devcontainer-test$ docker build -f .devcontainer/Dockerfile --build-arg VARIANT="16-bullseye" .
Sending build context to Docker daemon  4.608kB
Step 1/2 : ARG VARIANT=16-bullseye
Step 2/2 : FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT}
 ---> f9bdb7d738da
Successfully built f9bdb7d738da

sysadmiral avatar Sep 07 '22 22:09 sysadmiral

So changing line 57 to:

ARGS=$(echo $CONFIG | jq -r '.build.args | to_entries? | map("--build-arg \(.key)=\(.value)")? | join(" ")')

seems to resolve this but I'm not sure of the wider implications of removing the \" from around \(.value)...

sysadmiral avatar Sep 07 '22 23:09 sysadmiral

Changing line 57 didn't fix it for me. I had to manually go in and change it so that it wasn't using an argument. That does seem to be the issue though. Good job!

toddas90 avatar Sep 27 '22 20:09 toddas90