Как установить приложение аргументов для appcmd таким же образом для изображений ltsc2016 и lt2019?

#docker #powershell #iis-8 #docker-for-windows

Вопрос:

Я пытаюсь использовать один и тот же файл dockerfile для создания изображений ltsc2016 и ltsc2019, но я застрял в команде appcmd.

Для ltsc2016 работает только в том случае, если котировки ' :

 RUN c:windowssystem32inetsrvappcmd set app 'Default Web Site/' /enabledProtocols:"http"
 

Если я перейду на двойные кавычки:

БЕГИ c:windowssystem32inetsrvappcmd установите приложение «Веб-сайт по умолчанию/» /Включенные настройки:»http»

Не удалось обработать ввод: параметр » Web » должен начинаться с / или — (HRESULT=80070057).

Для изображения ltsc2019 работает только в том случае, если изображения " :

 RUN c:windowssystem32inetsrvappcmd set app "Default Web Site/" /enabledProtocols:"http"
 

Но если я установлю значение равным ltsc2019, я получу:

для обработки ввода: Параметр «Web» должен начинаться с / или — (HRESULT=80070057).

Странно, но enabledProtocols отлично работает на обоих изображениях, используя один и тот же символ для цитаты.

Это похоже на ошибку на appcmd.exe но я не смог бы обойти это.

Есть какие-нибудь идеи?

Файл dockerfile:

 # escape=`

#from ms samples https://github.com/microsoft/dotnet-framework-docker/blob/main/src/wcf/4.8/windowsservercore-ltsc2022/Dockerfile

ARG REPO=mcr.microsoft.com/dotnet/framework/aspnet
ARG OS_VERSION=ltsc2022
FROM $REPO:4.8-windowsservercore-${OS_VERSION}

# Install Windows components required for WCF service hosted on IIS
RUN dism /Online /Quiet /Enable-Feature /All /FeatureName:WCF-HTTP-Activation45 /FeatureName:WCF-TCP-Activation45 /FeatureName:IIS-WebSockets /FeatureName:IIS-BasicAuthentication

# Enable net.tcp protocol for default web site on IIS
RUN c:windowssystem32inetsrvappcmd set app "Default Web Site/" /enabledProtocols:"http"

EXPOSE 80

WORKDIR C:inetpubwwwroot

COPY . .
 

Комментарии:

1. Что, если вы поместите все команды в .ps1 файл, а затем вызовете powershell -file some.ps1 свои Dockerfile ? Может быть, плохой парень-Докер.

2. Просто некоторые общие указания: если ' кавычки работают, подразумевается, что PowerShell используется для выполнения командной строки. Если " работают только кавычки, cmd.exe подразумевается (или вообще не используется оболочка).

Ответ №1:

@mklement0 дал правильный указатель, команда была выполнена с cmd.exe одним изображением и с powershell другим, и это вызывало разное поведение в отношении кавычек.

Итак, просто нужно было заставить RUN команду использовать powershell всегда, добавив следующую команду при запуске:

 SHELL ["powershell", "-Command"]
 

Полный файл dockerfile:

 # escape=`

#from ms samples https://github.com/microsoft/dotnet-framework-docker/blob/main/src/wcf/4.8/windowsservercore-ltsc2022/Dockerfile

ARG REPO=mcr.microsoft.com/dotnet/framework/aspnet
ARG OS_VERSION=ltsc2022
FROM $REPO:4.8-windowsservercore-${OS_VERSION}

#force the use of powershell on all builds
SHELL ["powershell", "-Command"]

# Install Windows components required for WCF service hosted on IIS
RUN dism /Online /Quiet /Enable-Feature /All /FeatureName:WCF-HTTP-Activation45 /FeatureName:WCF-TCP-Activation45 /FeatureName:IIS-WebSockets /FeatureName:IIS-BasicAuthentication

# Enable net.tcp protocol for default web site on IIS
RUN c:windowssystem32inetsrvappcmd set app "Default Web Site/" /enabledProtocols:"http"

EXPOSE 80

WORKDIR C:inetpubwwwroot

COPY . . 
 

Комментарии:

1. Называть это msdos -старая привычка, которая не умерла. только что обновлено.