0

I'm running into a problem with docker where I'm using some variables in the dockerfile. The variables work everywhere except in the source= argument of a bind mount.

I'm installing a large (40+ GB) software package. I have three different versions to work with so I made a variable to identify the version directory. I'm using a bind mount to avoid sending the installation source to the image.

What is the best way to debug? --progress=plain and --no-cache don't really show much more on the error message.

Is there a better way to do this whole thing? I don't want to create 150 GB images if I can avoid that. If I have all three versions of software in one directory that could be a long build and a big image since I need to select the version at build time. I guess I may need a more involved build process than allowed here--what would that look like?

How do I get around this variable issue?

The command that causes the problem is here:

ARG SOFTWARE_DIR=MySoftwareDirectory #this lives in the same directory as the *.docker
ARG SOFTWARE_VER=2022.3

FROM centos:latest AS base

RUN yum update -y \
    && yum upgrade -y \
    && yum install -y libXext libXrender libXtst \
    && yum clean all
RUN mkdir /tools

FROM base as final
ARG SOFTWARE_VER
ARG SOFTWARE_DIR
COPY ./install_config_${SOFTWARE_VER}.txt /tools/install_config.txt
RUN --mount=type=bind,target=/mnt/${SOFTWARE_DIR},readonly,source=${SOFTWARE_DIR} \
    /mnt/${SOFTWARE_DIR}/setup --batch
ENTRYPOINT ["/tools/software/${SOFTWARE_VER}/bin/software"]

The error is:

ERROR: "/${SOFTWARE_DIR}" not found: not found
...
failed to computer cache key: "/${SOFTWARE_DIR}" not found: not found

This works:

ARG SOFTWARE_DIR=MySoftwareDirectory #this lives in the same directory as the *.docker
ARG SOFTWARE_VER=2022.3

FROM centos:latest AS base

RUN yum update -y \
    && yum upgrade -y \
    && yum install -y libXext libXrender libXtst \
    && yum clean all
RUN mkdir /tools

FROM base as final
ARG SOFTWARE_VER
ARG SOFTWARE_DIR
COPY ./install_config_${SOFTWARE_VER}.txt /tools/install_config.txt
RUN --mount=type=bind,target=/mnt/${SOFTWARE_DIR},readonly,source=MySoftwareDirectory \
    /mnt/${SOFTWARE_DIR}/setup --batch
ENTRYPOINT ["/tools/software/${SOFTWARE_VER}/bin/software"]

I am building with:

DOCKER_BUILDKIT=1 docker build -t software -f software.docker . 

My directory structure looks like this:

software.docker
MySoftwareDirectory 

I did chmod 777 on MySoftwareDirectory to correct permissions issue. (I know not the best way)

Docker version is 20.10.21. Host is CentOS 7 fully patched.

  • did you have a look at this ? https://stackoverflow.com/questions/40164660/bash-brace-expansion-not-working-on-dockerfile-run-command – julian Dec 08 '22 at 15:12
  • I'm not sure I understand what you mean. Are you suggesting that the docker command: RUN --mount=type=bind,target=/mnt/SOFTWARE_DIR,readonly,source=${SOFTWARE_DIR} is using brace expansion? – FirmwareRootkits Dec 08 '22 at 16:59

0 Answers0