Windows — Docker CMD не выполняется

На всю жизнь я не могу заставить свой сценарий подготовки выполняться при запуске контейнера. В дальнейшем мне нужно будет передать аргументы команде запуска docker, чтобы заменить «hiiii» и «123» для развертывания нескольких контейнеров.

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

FROM microsoft/aspnet:3.5-windowsservercore-10.0.14393.1198

SHELL [“powershell”, “-Command”, “$ErrorActionPreference = ‘Stop’; $ProgressPreference = ‘SilentlyContinue’;”]

COPY *.ps1 /Container/

COPY [“wwwroot”, “/inetpub/wwwroot”]
COPY [“Admin”, “/Program Files (x86)Admin”]
COPY [“Admin/web.config”, “/Program Files (x86)/Admin/web_default.config”]

#ENTRYPOINT [“powershell”]
CMD [“powershell.exe”, -NoProfile, -File, C:\Container\Start-Admin.Docker.Cmd.ps1 -Parm1 ‘Hiiii’ -parm2 ‘123’]

Я также пробовал версию оболочки CMD следующим образом

CMD powershell -NoProfile -File C:\Container\Start-Admin.Docker.Cmd.ps1 -Parm1 ‘Hiiii’ -Parm2 ‘123’

Это команда, которую я использую.

docker image build -t image:v1:v1 .
docker run --name container -p 8001:80 -d image:v1

После того, как я создаю и запускаю контейнер, я вижу, что скрипт не запустился или завершился с ошибкой. Тем не менее, я могу запустить powershell в контейнере и запустить скрипт вручную, и он отлично работает, и я вижу все необходимые мне изменения.

docker exec --interactive --tty container powershell
C:\Container\Start-Admin.Docker.Cmd.ps1 -Parm1 ‘Hiiii’ -Parm2 ‘123’

Я просто не понимаю, чего мне не хватает в отношении CMD.

Спасибо!


person Drew Fleming    schedule 29.09.2017    source источник
comment
Зачем вообще нужен cmd.exe? Просто запустите PowerShell напрямую.   -  person Bill_Stewart    schedule 29.09.2017
comment
Я думаю, что вы пропустили / здесь: COPY [“Admin”, “/Program Files (x86)Admin”]   -  person BenH    schedule 29.09.2017


Ответы (2)


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

FROM microsoft/aspnet:3.5-windowsservercore-10.0.14393.1198

#The shell line needs to be removed and any RUN commands need to be immediately proceeded by 'powershell' eg RUN powershell ping google.com
#SHELL [“powershell”, “-Command”, “$ErrorActionPreference = ‘Stop’; $ProgressPreference = ‘SilentlyContinue’;”]

COPY *.ps1 /Container/

COPY [“wwwroot”, “/inetpub/wwwroot”]
COPY [“Admin”, “/Program Files (x86)Admin”]
COPY [“Admin/web.config”, “/Program Files (x86)/Admin/web_default.config”]

ENV myParm1 Hiiii
ENV myParm2 123
ENTRYPOINT ["powershell", "-NoProfile", "-Command", "C:\\Container\\Start-Admin.Docker.Cmd.ps1"]
CMD ["-parm1 $Env:myParm1 -parm2 $Env:myParm2"] 

Команда запуска докера выглядит так

docker run -d -p 8001:80 -e "myParm1=byeeeee" --name=container image:v1

Я надеюсь, что это поможет кому-то еще, кто находится в моей лодке. Спасибо за ответы на все вопросы!

person Drew Fleming    schedule 02.10.2017
comment
Это вытащило меня из тупика. Большое спасибо. - person Timothy John Laird; 14.05.2019

Вы можете попробовать. ARG передает переменную в оболочку, доступную через переменную PS $env:.

ARG parmOne=Hiiii
ARG parmTwo=123

# Run a native PowerShell session and pass the script as a command.
RUN ["powershell", "-NoProfile", "-Command", "C:\\Container\\Start-Admin.Docker.Cmd.ps1 -Parm1 $env:parmOne -parm2 $env:parmTwo"]
person ekeeling    schedule 29.09.2017
comment
Это еще не все — в конце концов мне нужно будет заменить «hiii» и «123» переменными среды, переданными из запуска docker. Поскольку в настоящее время мне нужно передать переменные, команду RUN нельзя использовать, поскольку она является частью процесса сборки докера. Предполагается, что команда CMD выполняет часть CMD файла докера при запуске докера, но она этого не делает. - person Drew Fleming; 29.09.2017
comment
Обычно это работает для меня, пока мне не нужны переменные для хранения после сборки. Если вам нужны переменные, сохраненные после сборки, вы можете использовать PowerShell, чтобы добавить их как постоянные переменные. - person ekeeling; 29.09.2017
comment
Да, мне нужно обновить после сборки. Эти значения будут специфическими для клиента, такими как строки подключения. Идея состоит в том, чтобы использовать разные контейнеры одного и того же образа с разными настройками конфигурации. - person Drew Fleming; 29.09.2017
comment
@DrewFleming - почему бы не определить переменные среды, которые вы хотите использовать в Dockerfile, и передать их с помощью docker run. Кроме того, если ваша оболочка SHELL уже настроена на PowerShell, то в инструкции CMD вам не нужно снова ссылаться на полный powershell.exe, просто укажите ссылку на файл сценария и передайте ему требуемые аргументы, используя $env:{имя переменной среды} - person Chris Lawrence; 01.10.2017