使用Docker容器测试C++代码
使用Docker容器配置Clion能用的MSVC Toolchain,并调试C++代码
因为最近关于我的一个项目有架构变动的情况,所以我第一次在电脑上安装Docker,考虑到最后我的代码也要在Docker环境中测试,所以我想,索性平常就直接在Docker环境中测试,将Docker配置到CLion的Toolchain中,不仅方便测试,而且适合代码实际运行环境。下面就是配置的流程以及遇到的一些问题和解决方法。(全程都在Gemini-2.5-pro辅助下完成)
后记:最初我的想法确实如前面所说的那样,可是当我花了两天时间真的来搞之后,我发现,这里有一个难以跨越的障碍——不论是CLion、Visual Studio还是VS Code,它们都不支持Windows架构的Docker容器作编译环境,也不支持远程是Windows的远程开发,甚至还不支持将Windows系统的Docker容器作为开发容器。(官方文档参考他们支持的操作系统就知道了1)也就是说,所有这些IDE都没有提供支持,甚至微软自己的IDE都没有提供支持😡,深度集成的期望算是失败了。不过已经写了很多笔记的我觉得,如果删去这段经历,不仅浪费了我前面的心血,而且如果我下次还遇上这种情况,我也可以来借鉴一下这次的经验,所以我没有删去这部分,仍然保留在文章中。况且,如果我们退而求其次,在容器中测试代码仍然是可以的,关于这部分,我在后面也有说到。
原理
首先,截止文章完成之日,CLion并没有支持使用Windows的Docker容器做测试用Toolchain,仅仅支持Linux架构的Docker容器用于Toolchain1,所以我们只能采用Remote Toolchain的方式达成我们的目的,不过坏处就是我们必须要提前开启一个容器,这个容器要带有对应编辑器等等的工具,还要有OpenSSH用来建立连接,下面我们就一步步地来搭建。
创建带MSVC的Windows环境的镜像
首先我们需要安装MSVC,至于怎么安装,微软官方已经给出了配置方式2。我们只需要在Dockerfile里写如下内容,然后构建即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# escape=`
# Use the latest Windows Server Core 2022 image.
FROM mcr.microsoft.com/windows/servercore:ltsc2022
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
RUN `
# Download the Build Tools bootstrapper.
curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/release/vs_buildtools.exe `
`
# Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
&& (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
--installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools" `
--add Microsoft.VisualStudio.Workload.AzureBuildTools `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
--remove Microsoft.VisualStudio.Component.Windows81SDK `
|| IF "%ERRORLEVEL%"=="3010" EXIT 0) `
`
# Cleanup
&& del /q vs_buildtools.exe
# Define the entry point for the docker container.
# This entry point starts the developer command prompt and launches the PowerShell shell.
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
使用如下命令(例)构建:
1
docker build -t msvc .
这样就有了一个带MSVC的,使用Windows环境的Docker容器。
当然,这里不遇到问题是不可能的,我第一次运行报错
1
2
ERROR: failed to build: failed to solve: mcr.microsoft.com/windows/servercore:ltsc2022: failed to resolve source metadat
a for mcr.microsoft.com/windows/servercore:ltsc2022: no match for platform in manifest: not found
原因不是镜像地址不存在,而是因为我当前的 Docker Desktop 正运行在“Linux 容器模式”下,而它需要切换到“Windows 容器模式”才能拉取并构建 Windows 镜像,而操作方法是右键快捷栏的Docker图标,选择“Switch to Windows containers…”3。但是,当然,我没有看到这个图标,原因不清楚,但是解决方法是重装,并且在重装第一步勾选上开启Windows容器即可。4
这些改完之后,我还遇到一个问题
1
2
3
4
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM mcr.microsoft.com/windows/servercore:ltsc2022
ltsc2022: Pulling from windows/servercore
no matching manifest for windows(10.0.19045)/amd64 in the manifest list entries
这个表示我的系统版本太老了,2022没有我这个系统的版本,解决办法是换一个版本即可,这里我换成了2019的版本。也就是改一下FROM后面的镜像的版本号,在此不再赘述。
下载镜像过程中会遇到网络问题,我发现直接使用上面的Dockerfile构建不会经过镜像站下载,所以建议先通过镜像站拉取mcr.microsoft.com/windows/servercore:ltsc2019
到本地,然后再构建Dockerfile。
创建专用于Toolchain的镜像
安装OpenSSH
本来Windows是带有OpenSSH支持的,可是按照网上的各种在一般电脑上安装的流程都安装失败,原因也一直搞不明白,命令突然结束,就报一个错,也没有日志生成,进入容器查看也被告知不可行,挂载卷也没法设置(不知为何,但是就是被拒绝了),一直怀疑是权限问题,可是最后没有调整权限,纯莫名其妙地解决了这个问题,就是从OpenSSH安装包里从新安装OpenSSH(但是同时Windows支持的OpenSSH也要安装),下面就说一下我怎么安装的吧,不过至于我安装成功的原因,我也不清楚。(不是最终Dockerfile)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# escape=`
# =====================================================================
# STAGE 1: 安装 .NET Framework 4.8 这个前置依赖
# 这个阶段的目标只有一个:创建一个安装好了 .NET 4.8 的“中间镜像”
# =====================================================================
FROM msvc:latest AS dotnet-installer
# 声明默认 shell
SHELL ["cmd", "/S", "/C"]
# 下载并静默安装 .NET 4.8,然后等待它完成。
# /q 代表静默安装,/norestart 表示安装后不主动触发重启。
# start /w 命令会确保我们等待安装程序完全退出。
RUN curl -SL --output dotnet-installer.exe https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe `
&& start /w dotnet-installer.exe /q /norestart `
&& del dotnet-installer.exe
# =====================================================================
# STAGE 2: 在已经装好 .NET 的“新”基础上,构建最终的 CLion 镜像
# =====================================================================
# 这里的 FROM dotnet-installer 意味着我们从上一个阶段的结果开始构建
FROM dotnet-installer
SHELL ["powershell", "-Command", "Set-ExecutionPolicy RemoteSigned -Scope Process -Force;"]
# 1. 安装 OpenSSH
## 复制我下好的OpenSSH安装包到容器,也可以url下载,但是那样容器连不上github,所以我选择手动下载,附url下载命令:
## Invoke-WebRequest -Uri https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.5.0.0p1-Beta/OpenSSH-Win64.zip -OutFile C:\openssh.zip
COPY openssh.zip C:\openssh.zip
## 安装Windwos支持的OpenSSH(主要是第三行,其他行不加会报错,貌似是启动什么服务用的)
RUN Set-Service -Name wuauserv -StartupType Manual; `
Start-Service -Name wuauserv; `
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0; `
Stop-Service -Name wuauserv
RUN `
$ErrorActionPreference = 'Stop'; `
$ProgressPreference = 'SilentlyContinue'; `
Expand-Archive -Path C:\openssh.zip -DestinationPath C:\openssh-temp; `
& C:\openssh-temp\OpenSSH-Win64\install-sshd.ps1 -Confirm:$false; `
& C:\openssh-temp\OpenSSH-Win64\FixHostFilePermissions.ps1 -Confirm:$false; `
& C:\openssh-temp\OpenSSH-Win64\FixUserFilePermissions.ps1 -Confirm:$false
# 删除安装包
RUN Remove-Item -Path C:\openssh.zip -Force
RUN echo '@call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\Tools\VsDevCmd.bat"' | Set-Content -Path C:\msvc-shell.cmd
RUN Set-ItemProperty -Path 'HKLM:\SOFTWARE\OpenSSH' -Name DefaultShell -Value 'C:\msvc-shell.cmd' -Force
# 配置OpenSSH自动启动(我不知道有没有用,反正我还是后面EntryPoint启动的)
RUN Set-Service -Name sshd -StartupType 'Automatic'
# 生成密钥
RUN ssh-keygen.exe -A
# 2. 安装 Chocolatey 和 CMake
RUN [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')); `
choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'
SHELL ["cmd", "/S", "/C"]
# 为CLion创建帐户 msvc-clion 并配置它的默认 shell 为 cmd
RUN net user msvc-clion "Clion602" /add `
&& net localgroup "Remote Desktop Users" msvc-clion /add
COPY start.cmd C:\start.cmd
# 暴露端口,设置启动命令
EXPOSE 22
ENTRYPOINT ["C:\\start.cmd"]
而start.cmd
的内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@echo off
echo Starting SSHD service...
powershell C:\openssh-temp\OpenSSH-Win64\install-sshd.ps1
powershell Start-Service sshd
:: 检查 sshd 服务是否真的启动成功
IF %ERRORLEVEL% NEQ 0 (
echo.
echo #######################################################
echo # ERROR: Failed to start the SSHD service. #
echo # To exit, run: docker stop <container_name> #
echo #######################################################
echo.
echo ======================== SSHD.LOG OUTPUT START =======================
type C:\ProgramData\ssh\logs\sshd.log || echo [Log file does not exist or is empty]
echo ========================= SSHD.LOG OUTPUT END ========================
echo exit /b %ERRORLEVEL%
)else (
echo.
echo #######################################################
echo # SSHD Service Started Successfully. #
echo # Container is running and ready for connections. #
echo # To exit, run: docker stop <container_name> #
echo #######################################################
echo.
)
:: 使用 PowerShell 的无限循环来可靠地保持容器前台运行
powershell.exe -NoProfile -Command "& {while($true){Start-Sleep -Seconds 3600}}"
采取的是多步骤安装的方式,因为.NET 4.8
的安装需要重启系统,而单步骤是不可能完成的,所以采取多步骤;下载Chocolatey是因为Gemini说它是Windows的一个包管理器(梦寐以求的),用来下载CMake。
下面再附我为了解决前面OpenSSH没法启动的问题参考过的全部资料(弄了我一天😭)5
集成到CLion
正如我在文章开头说的那样,在费力捣鼓了两天之后,到这里我才发现,CLion根本没有支持Windows架构的Docker容器作编译环境,也不支持远程是Windows的远程开发,甚至还不支持将Windows系统的Docker容器作为开发容器。所以我又去看Visual Studio,心想微软自己的软件和系统,没道理不支持吧,结果,还真不支持😡。同样地,VSCode也不支持,所以我只能选择退一步,平常在我的电脑上测试代码,只是不定时地用Docker测试一下能跑,并且用一个批处理脚本半自动这件事。
在Docker中编译和测试代码
半自动脚本
首先,因为Hyper-V,docker cp
命令是没有办法使用的,我们只能采用挂载卷的方式,我们需要挂载源代码目录和Vcpkg目录,不然程序无法正常地进行编译。首先,我先贴出我用来半自动进行测试的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@echo off
set CONTAINER_NAME=BiliBili_Reranger_Test_Container
set CONTAINER_SOURCE_DIR=C:/biliBili_reranger
set LOCAL_BUILD_DIR=..\\build\\DockerTest
set VS_DEV_CMD="C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat"
set VCPKG="D:/Microsoft Visual Studio/Include/vcpkg"
set VCPKG_IN_DOCKER="C:/vcpkg"
set VCPKG_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
chcp 65001 > nul
echo.
echo =================================================================
echo [PHASE 1/3] 执行:容器创建及准备工作
echo =================================================================
docker stop %CONTAINER_NAME%
docker rm %CONTAINER_NAME%
rmdir /s %LOCAL_BUILD_DIR% /Y
mkdir %LOCAL_BUILD_DIR%
mkdir %LOCAL_BUILD_DIR%\\src
xcopy ..\\src %LOCAL_BUILD_DIR%\\src /E/Y
mkdir %LOCAL_BUILD_DIR%\\plugins
xcopy ..\\plugins %LOCAL_BUILD_DIR%\\plugins /E/Y
copy ..\\ %LOCAL_BUILD_DIR%
docker run -d --env-file env.list --name %CONTAINER_NAME% -v %VCPKG%:%VCPKG_IN_DOCKER% -v %LOCAL_BUILD_DIR%:%CONTAINER_SOURCE_DIR% -it msvc_clion
echo.
echo =================================================================
echo [PHASE 2/3] 执行:命令容器进行编译和运行...
echo =================================================================
rem 在容器内执行构建和运行指令
docker exec %CONTAINER_NAME% cmd /c "call %VS_DEV_CMD% && cd %CONTAINER_SOURCE_DIR% && cmake -B build -DCMAKE_TOOLCHAIN_FILE=%VCPKG_TOOLCHAIN_FILE% && cmake --build build --config Debug && build\Debug\BiliBili_Reranger.exe"
rem 检查上一步的执行是否成功
IF %errorlevel% neq 0 (
echo.
echo [ERROR] 在容器内执行时发生错误!请检查上面的日志。
pause
)
docker stop %CONTAINER_NAME%
docker rm %CONTAINER_NAME%
echo.
echo =================================================================
echo [PHASE 3/3] 测试成功完成!
echo =================================================================
echo 你可以在本地的 '%LOCAL_BUILD_DIR%' 文件夹中找到所有产物。
不过这个时候我的镜像的Dockerfile也有变化,具体后文会讲
首先是执行docker run -d --env-file env.list --name %CONTAINER_NAME% -v %VCPKG%:%VCPKG_IN_DOCKER% -v %LOCAL_BUILD_DIR%:%CONTAINER_SOURCE_DIR% -it msvc_clion
创建一个容器,参数env.list是环境变量的配置,两个挂载卷分别是VCPKG和源代码的目录。
然后就是docker exec %CONTAINER_NAME% cmd /c "call %VS_DEV_CMD% && cd %CONTAINER_SOURCE_DIR% && cmake -B build -DCMAKE_TOOLCHAIN_FILE=%VCPKG_TOOLCHAIN_FILE% && cmake --build build --config Debug && build\Debug\BiliBili_Reranger.exe"
在容器里首先执行C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat
的脚本(对应于官方教程2的EntryPoint
,主要是配置一些关于VS的临时环境变量和打开一个专门的cmd运行环境),配置好环境之后,进行编译cmake -B build -DCMAKE_TOOLCHAIN_FILE=%VCPKG_TOOLCHAIN_FILE% && cmake --build build --config Debug
,其中-DCMAKE_TOOLCHAIN_FILE=%VCPKG_TOOLCHAIN_FILE%
用于明确指定使用Vcpkg工具链,也就是去Vcpkg里寻找依赖项。最后运行编译出来的程序。
程序运行完之后检查有没有报错,有报错就暂停等待我来处理,没有的话就直接删除容器(反正数据在挂载卷里,是持久化保存的)。
修改Dockerfile
正如前面所说,微软官方的MSVC安装方法的代码需要更改,如果不更改,我们安装CMake然后再编译程序,会报错说:找不到nmake。为什么呢?实际上是VS相关的工具链并没有完全进行安装,尤其是VS对CMake支持相关的工具并没有安装,所以使用CMake编译程序时,CMake完全找不到VS相关的工具链,包括MSVC等等的都找不到,为此我们其实只需要增加一点点代码,明确告诉VS要安装CMake相关的工具即可,也就是增加--add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.22621
安装相关工具即可。
此外,我还修改了我的两个镜像的安装顺序,将CMake提前到我的第一个镜像安装,然后在专门给CLion用的镜像里 (原本的计划,虽然后面不行) 再安装其他的一些东西,比如SSH等(虽然现在SSH也没用了)。最终我的第一个镜像msvc的Dockerfile如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# escape=`
# Use the latest Windows Server Core 2019 image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019 AS dotnet-installer
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
RUN `
# Download the Build Tools bootstrapper.
curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/release/vs_buildtools.exe `
`
# Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
&& (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
--installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools" `
--add Microsoft.VisualStudio.Workload.AzureBuildTools `
--add Microsoft.VisualStudio.Workload.VCTools `
--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
--add Microsoft.VisualStudio.Component.Windows11SDK.22621 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
--remove Microsoft.VisualStudio.Component.Windows81SDK `
|| IF "%ERRORLEVEL%"=="3010" EXIT 0) `
`
# Cleanup
&& del /q vs_buildtools.exe
# 下载并静默安装 .NET 4.8,然后等待它完成。
# /q 代表静默安装,/norestart 表示安装后不主动触发重启。
# start /w 命令会确保我们等待安装程序完全退出。
RUN curl -SL --output dotnet-installer.exe https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe `
&& start /w dotnet-installer.exe /q /norestart `
&& del dotnet-installer.exe
# =====================================================================
# STAGE 2: 在已经装好 .NET 的“新”基础上,构建最终的 CLion 镜像
# =====================================================================
# 这里的 FROM dotnet-installer 意味着我们从上一个阶段的结果开始构建
FROM dotnet-installer
SHELL ["powershell", "-Command", "Set-ExecutionPolicy RemoteSigned -Scope Process -Force;"]
# 安装 Chocolatey 和 CMake
RUN [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')); `
choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'
SHELL ["cmd", "/S", "/C"]
# Define the entry point for the docker container.
# This entry point starts the developer command prompt and launches the PowerShell shell.
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
第二个镜像msvc_clion的Dockerfile如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# escape=`
# =====================================================================
# STAGE 1: 安装 .NET Framework 4.8 这个前置依赖
# 这个阶段的目标只有一个:创建一个安装好了 .NET 4.8 的“中间镜像”
# =====================================================================
FROM msvc:latestd
SHELL ["powershell", "-Command", "Set-ExecutionPolicy RemoteSigned -Scope Process -Force;"]
# 1. 安装 OpenSSH
## 复制我下好的OpenSSH安装包到容器,也可以url下载,但是那样容器连不上github,所以我选择手动下载,附url下载命令:
## Invoke-WebRequest -Uri https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.5.0.0p1-Beta/OpenSSH-Win64.zip -OutFile C:\openssh.zip
COPY openssh.zip C:\openssh.zip
## 安装Windwos支持的OpenSSH(主要是第三行,其他行不加会报错,貌似是启动什么服务用的)
RUN Set-Service -Name wuauserv -StartupType Manual; `
Start-Service -Name wuauserv; `
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0; `
Stop-Service -Name wuauserv
RUN `
$ErrorActionPreference = 'Stop'; `
$ProgressPreference = 'SilentlyContinue'; `
Expand-Archive -Path C:\openssh.zip -DestinationPath C:\openssh-temp; `
& C:\openssh-temp\OpenSSH-Win64\install-sshd.ps1 -Confirm:$false; `
& C:\openssh-temp\OpenSSH-Win64\FixHostFilePermissions.ps1 -Confirm:$false; `
& C:\openssh-temp\OpenSSH-Win64\FixUserFilePermissions.ps1 -Confirm:$false
# 删除安装包
RUN Remove-Item -Path C:\openssh.zip -Force
# 配置OpenSSH自动启动(我不知道有没有用,反正我还是后面EntryPoint启动的)
RUN Set-Service -Name sshd -StartupType 'Automatic'
# 生成密钥
RUN ssh-keygen.exe -A
# 为CLion创建帐户 msvc-clion 并配置它的默认 shell 为 cmd
#RUN echo '@call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\Tools\VsDevCmd.bat"' | Set-Content -Path C:\msvc-shell.cmd
#RUN Set-ItemProperty -Path 'HKLM:\SOFTWARE\OpenSSH' -Name DefaultShell -Value 'C:\msvc-shell.cmd' -Force
SHELL ["cmd", "/S", "/C"]
RUN net user msvc-clion "Clion602" /add `
&& net localgroup "Remote Desktop Users" msvc-clion /add
COPY start.cmd C:\start.cmd
# 暴露端口,设置启动命令
EXPOSE 22
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
ENTRYPOINT ["C:\\start.cmd"]
里面的C:\\start.cmd
启动脚本如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@echo off
echo Starting SSHD service...
powershell C:\openssh-temp\OpenSSH-Win64\install-sshd.ps1
powershell Start-Service sshd
:: 检查 sshd 服务是否真的启动成功
IF %ERRORLEVEL% NEQ 0 (
echo.
echo #######################################################
echo # ERROR: Failed to start the SSHD service. #
echo # To exit, run: docker stop <container_name> #
echo #######################################################
echo.
echo ======================== SSHD.LOG OUTPUT START =======================
type C:\ProgramData\ssh\logs\sshd.log || echo [Log file does not exist or is empty]
echo ========================= SSHD.LOG OUTPUT END ========================
echo exit /b %ERRORLEVEL%
)else (
echo.
echo #######################################################
echo # SSHD Service Started Successfully. #
echo # Container is running and ready for connections. #
echo # To exit, run: docker stop <container_name> #
echo #######################################################
echo.
)
:: 使用 PowerShell 的无限循环来可靠地保持容器前台运行
powershell.exe -NoProfile -Command "& {while($true){Start-Sleep -Seconds 3600}}"
关于CLion官方对Docker的支持情况,大家可以参考如下几篇链接,官方Docker Toolchain配置教程,官方参考Dockerfile,关于支持Windows的讨论 ↩︎ ↩︎2
这个切换之后,你会发现之前下载的Linux运行的镜像都消失了,同理,完成本文的操作再切回Linux,Windows的镜像也看不到了,这实际上就是切换运行环境带来的缺点,没什么好办法解决。不过我刚刚开始使用Docker,所以问题对我还不是很大。另外值得一提的是,切换为Windows模式之后,镜像和容器储存的目录不能更改,也就是说,镜像什么的只能存在C盘,这很容易导致C盘溢出(因此我镜像构建失败好多次我才发现)。只能说,果然Docker更适合Linux系统。 ↩︎
搜索解决办法的过程中,针对许多类似情况,我看到许多可能有用的文章,现罗列如下:Github讨论 命令切换 系统设置 另一种设置方法(我找不到配置按钮) ↩︎
微软官方安装方法、ssh安装方法、windows开启ssh server服务、ssh链接方法、Windows 上的 OpenSSH:安装、配置和使用指南、ssh无输出 1067报错、1067报错 ↩︎