【问题标题】:docker build failed : Not able to set the environment variablesdocker build 失败:无法设置环境变量
【发布时间】:2019-03-16 16:20:04
【问题描述】:

我正在尝试使用 docker 构建 QT 应用程序。我有 Visual Studio 2015 构建工具和 QT 5.11.2 作为基础 Docker 映像。当我尝试 docker build QT 应用程序时,我收到此错误。

C:\Qt\5.11.2\msvc2015_64\include\QtCore/qglobal.h(45):致命错误 C1083:无法打开包含文件:'type_traits':没有这样的文件或 目录

当我检查这个文件'type_traits'时,在docker里面它存在于这个路径中:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include

docker build 在这一步失败:

RUN C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe

这个命令RUN ["C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat", "x86_amd64"]设置环境变量,如何验证dockerfile中其余的RUN命令是否仍然存在?

以下是我的 docker 文件:

#My base docker image containing QT5.11.2 and Visual build tools 2015    
FROM qt 

COPY ["./", "C:/app"]

RUN $env:PATH ='C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;' + $env:PATH;\
    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine);

RUN $env:PATH ='C:\Qt\5.11.2\msvc2015_64\bin;' + $env:PATH;\
   [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine);

RUN $env:PATH ='C:\Qt\Tools\QtCreator\bin\jom.exe;' + $env:PATH;\
   [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine);

RUN $env:PATH ='C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;' + $env:PATH;\
    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine);

WORKDIR C:\\app
RUN ["C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat", "x86_amd64"]

RUN qmake app.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"  
RUN C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe qmake_all 
RUN C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe    
RUN C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe install
RUN mkdir dist\debug_build\app_dist  
RUN xcopy app_dist\dist_redist\*.* dist\debug_build\app_dist /E /Y >NUL

CMD cmd

【问题讨论】:

    标签: c++ qt docker visual-c++ qt5


    【解决方案1】:

    如何验证这些对于 dockerfile 中的其余 RUN 命令是否仍然存在?

    他们不会。

    这里

    存在的环境中
    RUN ["C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat", "x86_amd64"]
    

    执行带有参数x86_amd64的批处理文件的进程,创建新环境 任何 进程的设置 - 其中没有 - 然后退出。那么:

    RUN qmake app.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
    

    那里存在的环境中执行另一个进程,该进程仍然存在 环境。以此类推。

    对于这种行为,Docker 或 Windows 并没有什么特别之处。在任何操作 系统,一个进程不能修改其父的环境,只能修改它的副本 它继承并传递给任何子进程的那个环境。

    如果你想要所有的命令:

    qmake app.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
    C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe qmake_all
    C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe
    C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe install
    

    vcvarsall.bat x86_amd64修改的环境中开始,那么你 已在与该命令相同的 shell 中运行所有这些,例如

    RUN "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat" x86_amd64 && ^
        qmake app.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"  && \
        C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe qmake_all && \
        C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe && \
        C:\\Qt\\Tools\\QtCreator\\bin\\jom.exe install
    

    另见 dockerfile ENV command 一种在 docker 容器中进行全局环境设置的方法。

    【讨论】:

    • 好的,非常感谢。我试图在同一个 shell 中运行所有这些,但我得到 dockerfile 解析错误。未知指令 qmake。是否可以以 RUN exec 格式运行所有这些?
    • @user2301 抱歉,我使用了 Windows 行延续 (^)。它们应该是 dockerfile 中的 Unix 风格(`\`)。更新了答案。无论如何,它们只是为了便于阅读。都可以在一条线上。
    • 非常感谢。现在我可以成功构建了。
    猜你喜欢
    • 2018-07-20
    • 2021-08-23
    • 2017-01-13
    • 1970-01-01
    • 2013-10-30
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多