Я написал 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\"]