使用VS通过Docker运行项目时遇getcwd()失败及.NET SDK未找到错误
getcwd() failed及找不到.NET Core SDK的问题 你遇到的核心问题其实藏在getcwd() failed: No such file or directory这个报错里——看起来找不到.NET Core SDK只是表象,本质是容器启动时无法定位到正确的工作目录,进而引发了后续的连锁错误。我结合你的配置和症状,整理了几个针对性的排查修复步骤:
先拆解关键错误:getcwd() failed
这个错误说明容器尝试获取当前工作目录时失败了,通常是因为指定的工作目录不存在,或者执行命令时的路径上下文不对。虽然你的Dockerfile里在base阶段明确设置了WORKDIR /app,但结合你添加的wait-for-it.sh启动命令,问题大概率出在这个自定义命令的执行逻辑上。
具体修复方案
1. 确保wait-for-it.sh被正确复制到容器中
你的Dockerfile里没有任何复制wait-for-it.sh的步骤,但你在docker-compose.yml里直接调用了这个脚本——容器里根本没有这个文件,自然会导致路径异常。修改Dockerfile的final阶段:
FROM base AS final WORKDIR /app # 假设wait-for-it.sh在你的项目根目录下,复制到容器的工作目录 COPY wait-for-it.sh . # 给脚本添加执行权限 RUN chmod +x wait-for-it.sh COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MattsTwitchBot.Web.dll"]
2. 调整docker-compose.yml的启动命令逻辑
你当前的command覆盖了默认启动逻辑,而且没有正确衔接后续的.NET应用启动。应该用wait-for-it.sh的参数分隔符--,让脚本等待完成后自动启动你的应用:
command: ["/app/wait-for-it.sh", "http://couchbase:8091", "--", "dotnet", "MattsTwitchBot.Web.dll"]
这里用绝对路径执行脚本,避免工作目录切换带来的问题,同时通过--告诉脚本:等待完成后执行后面的dotnet启动命令。
3. 验证工作目录是否正常
可以临时替换命令,先进入容器检查目录结构,确认/app存在且文件齐全:
command: ["sh", "-c", "ls -la /app && pwd"]
启动容器后查看输出,确认/app目录下有你的应用文件和wait-for-it.sh脚本。
4. 彻底清理Docker缓存后重新构建
旧的镜像缓存可能残留异常配置,执行以下命令彻底清理后重新构建:
docker-compose down --rmi all -v docker-compose build --no-cache docker-compose up
为什么新建项目的Dockerfile能正常运行?
新建项目的模板没有添加wait-for-it.sh这类自定义命令,会直接执行Dockerfile里定义的ENTRYPOINT,而WORKDIR /app是Dockerfile明确创建的,所以不会出现目录不存在的问题。你的问题核心是自定义启动命令导致的路径/上下文错误,而非.NET SDK本身的缺失。
内容的提问来源于stack exchange,提问作者Matthew Groves

