从批处理脚本调用Docker(在Docker内部)

时间:2019-01-16 09:34:45

标签: docker batch-file cmake msbuild

我想从docker文件中调用cmake

当我手动执行该命令时,我已经设法使其正常运行,但是希望使用脚本将其自动化。

此刻我打电话给

"cmd C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Auxiliary/Build/vcvarsall.bat" x64 8.1

这给了我一个在路径上带有64位msbuild的cmd终端。

然后我可以打电话给cmake

cmake -G "Visual Studio 15 2017 Win64" .

问题是,我必须连接到容器并手动运行这些命令。

我希望能够做类似的事情

RUN call vcvarsall.bat" x64 8.1 | cmake -G "Visual Studio 15 2017 Win64" .

dockerfile

2 个答案:

答案 0 :(得分:1)

如果要在容器运行(而不是构建)时执行脚本,则必须将其放入ENTRYPOINTCMD指令中。但是,如果您有更好的管道传输方法,请将其全部放入单个bat文件中,然后从Dockerfile调用该文件

entrypoint.bat

call vcvarsall.bat x64 8.1 | cmake -G "Visual Studio 15 2017 Win64" .

Dockerfile

FROM foo
WORKDIR d:/work
# copy bat file into container
COPY entrypoint.bat d:/work/entrypoint.bat 
ENTRYPOINT ["d:/work/entrypoint.bat"]

因此,在构建图像后,只需不使用任何参数即可运行它

docker build -t my-image .
docker run my-image   # ENTRYPOINT gets executed here

答案 1 :(得分:0)

如果我很了解您的问题,那么您想在Dockerfile的构建过程中编译一个程序。确实, vcvarsall.bat 必须在使用MSVC编译器的任何命令之前执行。

我花了一些时间弄清楚什么是正确的语法,但这是我针对MSVC2015的解决方法:

SHELL ["\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\"", "amd64", "&&"]
RUN set

您将看到vcvarsall.bat设置的所有变量都将显示(例如: VCINSTALLDIR WindowsLibPath 等)