Неправильно проанализирован ENTRYPOINT в Windows Dockerfile - PullRequest
1 голос
/ 14 октября 2019

Я написал Dockerfile, который должен создавать образ Windows с java jdk внутри. Точка входа довольно проста, она просто запускает java.exe.

# escape=`

FROM mcr.microsoft.com/windows/servercore:ltsc2016

COPY .\install_files\jdk-8u221-windows-x64.exe C:\jdk-8u221-windows-x64.exe
COPY .\install_files\agent.jar C:\agent.jar

SHELL ["powershell", "-command"]
RUN Start-Process -Filepath C:\jdk-8u221-windows-x64.exe -passthru -wait -argumentlist "/s,INSTALLDIR=C:\Java,/L,java.log" ; `
    $env:Path += ';C:\Java\bin'

SHELL ["cmd", "/S", "/C"]

ENTRYPOINT ["java", "-jar", "C:\agent.jar"] 
CMD ["-jnlpUrl", "my_localhost", "-secret", "your_secret", "-workDir", "'C:\Jenkins'"]

Процесс сборки завершается успешно: docker build -t winwithjava:latest .

Но когда я пытаюсь docker run --name winjava001, появляется сообщение об ошибке::

'["java"' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

Поэтому я искал остановленный контейнер и получилвыполненная команда (docker ps -a --no-trunc):

"cmd / S / C java -jar C: \ agent.ja r 'cmd / S / C [\" - jnlpUrl \ ", \"http://localhost:8080/blabla\", \ "- secret \", \ "secret \", \ "- workDir \", \ "'C: \ Jenkins' \"] '"

Здесь язаметил, что оболочка добавляется к ENTRYPOINT и CMD, но кажется, что json вообще не анализировался. Я проверил внутри документа, и он явно говорит, что это предпочтительный способ указать аргументы набора по умолчанию для входной точки набора объявлений. Единственное мое сомнение - это предложение в справочнике :

Инструкция SHELL может повлиять на следующие инструкции, если форма shell они используются в Dockerfile: RUN, CMD и ENTRYPOINT.

Так это вызвано оператором SHELL? Потому что я использовал форму exec . Я не буду подвергать сомнению выбор реализации, я просто не понимаю, почему форма exec является предпочтительной, а оператор SHELL влияет только на операторы в форме shell . Но я, вероятно, что-то упускаю.

В любом случае, как мне написать этот Dockerfile, чтобы аргументы CMD можно было переопределить?

Единственная идея, которую я придумал, - использовать другую точку входа. :

["Write-Output", "'Jenkins agent started'", ";", "&", "'java'", "-jar", "'C:\agent.jar'"]

И удаление второго оператора SHELL. Но, опять же, json анализируется неправильно, как в предыдущем случае (но теперь используется powershell -command).

Версия Docker:

Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:26:49 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.24)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:39:49 2019
  OS/Arch:          windows/amd64
  Experimental:     false

EDIT

Я пытался с помощью этого базового файла Docker:

# escape=`

FROM mcr.microsoft.com/windows/servercore:ltsc2016

COPY .\install_files\jdk-8u221-windows-x64.exe C:\jdk-8u221-windows-x64.exe
COPY .\install_files\agent.jar C:\agent.jar

RUN powershell -command Start-Process -Filepath C:\jdk-8u221-windows-x64.exe -passthru -wait -argumentlist "/s,INSTALLDIR=C:\Java,/L,java.log" ; `
    $env:Path += ';C:\Java\bin'

CMD ["java", "-jar", "C:\agent.jar", "-jnlpUrl", "http://localhost:8080/xxx/slave-agent.jnlp", "-secret", "mysecret", "-workDir", "C:\Jenkins"]

Но все же запущенная команда (неправильная):

cmd /S /C [\"java\", \"-jar\", \"C:\\agent.jar\", \"-jnlpUrl\", \"http://localhost:8080/computer/windows001/slave-agent.jnlp\", \"-secret\", \"cefcfcfd09b91c09ce5c26b552be9b026ddc0674d1b28a9e8722a9630400ee1b\", \"-workDir\", \"C:\\Jenkins\"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...