You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows主机上使用docker-compose混合Windows与Linux容器时构建阶段报错求助

Windows主机上使用docker-compose混合Windows与Linux容器时构建阶段报错求助

我特别理解你现在遇到的这个困扰——手动切换Docker daemon能分别跑通两个容器,但用docker-compose一键启动就卡在Linux容器的构建环节,这个hcsshim::CreateComputeSystem的适配器错误确实挺棘手的。结合你的配置和操作场景,我整理了几个可能的解决方向,你可以逐一试试:

1. 重置WSL 2网络适配

这个错误大概率和WSL 2的网络适配器异常有关,先试试重置相关服务:

  • 打开管理员权限的PowerShell,依次运行:
    wsl --shutdown
    net stop docker
    net start docker
    
  • 重启Docker Desktop后,再执行docker-compose up -d测试。

2. 统一开启BuildKit支持

看你提供的daemon配置,Windows端关闭了BuildKit,而Linux端开启了。跨平台构建时BuildKit的兼容性更好,建议把Windows daemon的BuildKit也打开:

  • 编辑Windows的daemon.json文件,将"buildkit": false修改为"buildkit": true
  • 重启Docker Desktop使配置生效

3. 显式指定构建平台参数

虽然你已经在docker-compose.yml里指定了platform: linux,但可以尝试在构建时强制指定平台,确保Linux容器的构建走WSL 2的daemon:

docker-compose build --platform linux/amd64 apitier
docker-compose up -d

4. 验证WSL 2后端配置

确保Docker Desktop完全依赖WSL 2运行:

  • 打开Docker Desktop设置,确认Use the WSL 2 based engine已勾选
  • 进入Resources > WSL Integration,确保你安装的WSL发行版(如Ubuntu)已开启集成

你提供的配置整理(方便核对)

docker-compose.yml

version: '2.4'

services:
  webtier:
    image: webtier:win
    platform: windows
    ports:
      - 80
    build:
      context: .\WebTier
      dockerfile: Dockerfile
    depends_on:
      - apitier
    environment:
      ApiHost: "apitier"
  apitier:
    image: apitier:linux
    platform: linux
    expose:
      - 80
    build:
      context: .\ApiTier
      dockerfile: Dockerfile

ApiTier\Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:2.1 AS build
WORKDIR "/src/ApiTier"
COPY . .
RUN dotnet build "WebApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApi.dll"]

WebTier\Dockerfile

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
WORKDIR /inetpub/wwwroot
COPY docker/ .

Docker版本信息

Client:
 Cloud integration: v1.0.29
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:08:16 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.15.0 (93002)
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.24)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:03:04 2022
  OS/Arch:          windows/amd64
  Experimental:     true

docker-compose版本信息

docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020

如果以上方法都无效,你可以先切换到Linux daemon单独构建apitier镜像(docker-compose build apitier),再切回Windows daemon启动整个服务,先验证镜像本身是否正常。

备注:内容来源于stack exchange,提问作者marymk

火山引擎 最新活动