【问题标题】:Windows - Docker CMD does not executeWindows - Docker CMD 不执行
【发布时间】:2017-09-29 17:40:06
【问题描述】:

在我的一生中,当我运行我的容器时,我似乎无法让我的配置脚本执行。以后,我需要将参数传递给 docker run 命令来替换多个容器部署的“hiiii”和“123”。

这是我的 docker 文件

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’]

我也试过shell版本的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 方面缺少什么。

谢谢!

【问题讨论】:

  • 你为什么需要cmd.exe?直接运行 PowerShell。
  • 我想你在这里错过了/COPY [“Admin”, “/Program Files (x86)Admin”]

标签: powershell docker dockerfile docker-for-windows


【解决方案1】:

我能够让它按照我希望的方式工作。虽然我仍在处理配置脚本中的一些细节,但这就是我最终从 docker 方面获得我想要的结果的方式。

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 命令如下所示

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

我希望这对我船上的其他人有所帮助。谢谢大家的回答!

【讨论】:

  • 它让我摆脱了困境。非常感谢。
【解决方案2】:

你可以试试这个。 ARG 将变量传递给可通过 PS $env: variable 访问的 shell。

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"]

【讨论】:

  • 还有更多的故事——最终,我需要用从 docker run 传递的环境变量替换 'hiii' 和 '123'。由于此时我需要传递变量,因此不能使用 RUN 命令,因为这是 docker 构建过程的一部分。 CMD 命令应该在 docker run 上执行 dockerfile 的 CMD 部分,但它没有这样做。
  • 只要我不需要在构建后存储变量,这通常对我有用。如果您需要构建后存储的变量,可以使用 PowerShell 将它们添加为持久变量。
  • 是的,我确实需要在构建后更新。这些值将是客户端特定的东西,例如连接字符串。这个想法是使用具有不同配置设置的相同图像的不同容器。
  • @DrewFleming - 为什么不定义要在 Dockerfile 中使用的环境变量,并使用 docker run 将它们传递进去。此外,如果您的 SHELL 已设置为 PowerShell,那么在您的 CMD 指令中,您无需再次引用完整的 powershell.exe,只需引用您的脚本文件并使用 $env:{environment variable name} 将您需要的参数传递给它
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2016-09-06
  • 2015-10-25
  • 1970-01-01
  • 2015-07-07
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多