Невозможно использовать значения Arg в командах в dockerfile

Я пытаюсь разрешить передачу аргументов сборки в файл докеров во время процесса сборки, но я не могу понять, как заставить его работать.

Это мой файл докеров

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
RUN apt-get update && apt-get install openssh-server -y \
     && echo "root:Docker!" | chpasswd
COPY sshd_config /etc/ssh/
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 2222
ARG node_build=production
ENV node_build_env=$node_build
ARG net_build=Release
ENV net_build_env=$net_build

FROM node:12.18.3 AS node-build

RUN echo $build_command_env
WORKDIR /root
COPY ["MyProject/package.json", "."]
COPY ["MyProject/package-lock.json", "."]
RUN npm i --ignore-scripts
COPY ["MyProject/angular.json", "."]
COPY ["MyProject/tsconfig.json", "."]
COPY ["MyProject/tslint.json", "."]
COPY ["MyProject/src", "./src"]

RUN npx ng build -c $node_build_env

FROM microsoft/dotnet:2.2-sdk AS build

RUN echo $net_build_env
WORKDIR /src
COPY ["MyProject/MyProject.csproj", "MyProject/"]
COPY ["MyProject.ServiceModel/MyProject.ServiceModel.csproj", "MyProject.ServiceModel/"]
COPY ["MyProject.ServiceInterface/MyProject.ServiceInterface.csproj", "MyProject.ServiceInterface/"]
COPY ["NuGet.config", "NuGet.config"]
RUN dotnet restore "MyProject/MyProject.csproj"
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet build "MyProject.csproj" -c $net_build_env -o /app

FROM build AS publish

RUN dotnet publish "MyProject.csproj" -c $net_build_env -o /app

FROM base AS final
WORKDIR /app
COPY --chown=www-data:www-data --from=publish /app .
COPY --chown=www-data:www-data --from=node-build /root/wwwroot ./wwwroot
ENTRYPOINT service ssh start && dotnet MyProject.dll

Я пробовал много разных способов. Я пробовал просто использовать ARG и объявлять после каждого FROM, но это не сработало. В этой версии я пытался скопировать ARG в ENV, но это тоже не сработало.

Как мне это сделать?


person Guerrilla    schedule 02.07.2021    source источник
comment
Что именно не работает?   -  person larsks    schedule 02.07.2021
comment
Он не заменяет значение $ node_build_env. Пробовали как с ENV, так и с ARG   -  person Guerrilla    schedule 02.07.2021
comment
пожалуйста, дайте нам docker build команду, которую вы используете   -  person ahmadali shafiee    schedule 02.07.2021


Ответы (2)


Вы должны добавить --build-arg <arg>=<value> в свою команду сборки докера, чтобы использовать ARG аргументы в вашем файле контейнера.

Нет необходимости в ENV, если вы собираетесь использовать аргументы только в процессе сборки контейнера.

person ahmadali shafiee    schedule 02.07.2021
comment
Я указываю значение по умолчанию, поэтому это не требуется. Я обнаружил проблему, мне нужно было добавить двойные кавычки вокруг имени переменной. - person Guerrilla; 02.07.2021
comment
Ага. вы не упомянули, что даже значения по умолчанию не работают - person ahmadali shafiee; 02.07.2021
comment
Извини, я виноват... - person Guerrilla; 02.07.2021

Проблема заключалась в том, что переменная должна была быть заключена в двойные кавычки:

RUN dotnet build "MyProject.csproj" -c "$net_build_env" -o /app
person Guerrilla    schedule 02.07.2021
comment
Интересно, почему это так. Почему в этом случае важны двойные кавычки? Значение $net_build_env - одно слово, и команда без двойных кавычек должна работать нормально - person ahmadali shafiee; 02.07.2021
comment
Также работает ли это, если вы используете ARG напрямую и не используете ENV? - person ahmadali shafiee; 02.07.2021
comment
Да, работает только с ARG - person Guerrilla; 02.07.2021
comment
Еще одна странность в том, что теперь он создается для меня локально в Windows, но не встраивается в докер-хаб. - person Guerrilla; 02.07.2021
comment
можете ли вы попробовать это и посмотреть, работает ли это? - person ahmadali shafiee; 03.07.2021