Lỗi Lỗi getcwd () không thành công: Không có tệp hoặc thư mục nào như vậy khi cố chạy từ VS trong Docker


8

Tôi có một dự án được thiết lập để chạy cục bộ trong Docker với docker-compose. Cho đến gần đây, nó đã hoạt động tốt. Tôi không tin rằng tôi đã thay đổi bất cứ điều gì sẽ ảnh hưởng đến điều này (ngoại trừ có thể là nâng cấp VS?), Và tôi thậm chí đã thử quay lại với một cam kết cũ hơn. Trong mọi trường hợp, tôi hiện đang nhận được thông báo lỗi, xuất hiện trong cửa sổ đầu ra của Visual Studio dưới dạng:

docker exec -i f93fb2962a1e sh -c ""dotnet"  --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages  "bin/Debug/netcoreapp3.1/MattsTwitchBot.Web.dll" | tee /dev/console"
sh: 0: getcwd() failed: No such file or directory
  It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

Tôi đã thử nhiều thứ khác nhau (thay đổi hình ảnh cơ sở trong tệp Docker, xóa hình ảnh và thùng chứa cũ, v.v.) nhưng tôi vẫn nhận được thông báo lỗi tương tự. Điều kỳ lạ là khi tôi thực hiện File-> New, Visual Studio tạo ra một tệp Docker trông rất giống nhau và nó hoạt động tốt. Tôi không biết vấn đề là gì, nhưng tôi hy vọng ai đó ở đây có thể phát hiện ra nó.

Repo đầy đủ của tôi có sẵn trên Github . Đây là docker cho dự án cốt lõi asp.net:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MattsTwitchBot.Web/MattsTwitchBot.Web.csproj", "MattsTwitchBot.Web/"]
COPY ["MattsTwitchBot.Core/MattsTwitchBot.Core.csproj", "MattsTwitchBot.Core/"]
RUN dotnet restore "MattsTwitchBot.Web/MattsTwitchBot.Web.csproj"
COPY . .
WORKDIR "/src/MattsTwitchBot.Web"
RUN dotnet build "MattsTwitchBot.Web.csproj" -c Release -o /app/build

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

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

và docker-compose cho giải pháp (ngay cả khi không có công cụ Couchbase tôi cũng gặp lỗi tương tự, nhưng tôi sẽ dán nó ở đây cho đầy đủ):

version: '3.4'

services:
  couchbase:
    image: couchbase:6.5.0-beta2
    volumes:
    - "./couchbasetwitchbot:/opt/couchbase/var" # couchbase data folder
    ports:
    - "8091-8096:8091-8096" # https://docs.couchbase.com/server/current/install/install-ports.html
    - "11210-11211:11210-11211"
  mattstwitchbot.web:
    image: ${DOCKER_REGISTRY-}mattstwitchbotweb
    build:
      context: .
      dockerfile: MattsTwitchBot.Web/Dockerfile
    environment:
      Couchbase__Servers__0: http://couchbase:8091/ # Reference to the "couchbase" service name on line 4
    depends_on:
    - couchbase # Reference to the "couchbase" service name on line 4
    command: ["./wait-for-it.sh", "http://couchbase:8091"]

1
Tôi đã cặp với ai đó đêm qua và mọi thứ dường như hoạt động tốt từ dòng lệnh; và mọi thứ hoạt động tốt với anh ta từ Visual Studio. Tại thời điểm này, tôi nghĩ rằng việc thổi bay Visual Studio có thể là một giải pháp.
Matthew Groves

repo của bạn không thể tái sản xuất. Nó đi kèm với một lỗi người dùng. Sau đó, vấn đề certs. Tôi đã không thể làm cho nó hoạt động. Bây giờ, tại sao VS sẽ là một vấn đề? Mã của bạn chạy bên trong một container.
suren

Tôi nghi ngờ VS vì phiên ghép đôi này. Tôi đã có thể chạy docker-compose từ dòng lệnh và nó dường như hoạt động tốt (và không gây ra lỗi getcwd). Khi bạn nói "repo của tôi không thể tái tạo", ý bạn là gì? Bạn đã gặp lỗi gì? Tôi không gặp vấn đề về certs, cặp của tôi cũng vậy. "Lỗi người dùng" (ngoại lệ?) Có thể là do bạn không nhập thông tin đăng nhập, điều đó có nghĩa là bạn không gặp phải vấn đề tương tự như tôi.
Matthew Groves

Câu trả lời:


3

Tôi không có đủ danh tiếng để bình luận nhưng tôi nghĩ đó có thể là tệp .csproj của bạn. Bạn đã đề cập đến việc bạn đã nâng cấp Visual Studio. Vì tệp .csproj chứa thông tin về dự án (bao gồm các tham chiếu đến các cụm hệ thống) và bạn đang sao chép nó trong Dockerfile của mình, nên có thể:

  1. Tệp .csproj cần được cập nhật kể từ khi bạn cập nhật VS.
  2. Phiên bản lõi dotnet trong câu lệnh 'TỪ' của dockerfile là phiên bản khác với phiên bản bạn đang sử dụng cục bộ.

Có thể kiểm tra điều này bằng cách bắt đầu một dự án mới và thêm nguồn của bạn, sau đó thực hiện tìm khác biệt trên các tệp .csproj cũ và mới. Bạn cũng có thể sao lưu bản gốc và thử sửa đổi tệp .csproj theo cách thủ công. Tôi tìm thấy một bài đăng trên blog chứng minh việc nâng cấp tệp csproj vs2015 lên vs2017. Hy vọng nó sẽ giúp.


Nâng cấp VS của tôi là một lỗi nhỏ: 16.4.3 đến 16.4.4. Tôi tin rằng tôi đã thử một dự án mới và một khác biệt, nhưng tôi không nhận thấy bất cứ điều gì. Cảm ơn câu trả lời của bạn, và nó đáng để tôi thử lại.
Matthew Groves

1
@MatthewGroves Xin lỗi tôi không thể giúp đỡ nhiều hơn. Chúc bạn may mắn.
jaymac18

1

Bởi vì tôi không có đủ danh tiếng nên tôi không thể bình luận về câu hỏi của bạn. Nhưng có một điều khiến tôi bối rối là thực tế là bạn đang sử dụng làm hình ảnh cơ bản, một hình ảnh không có .Net SDK và nếu bạn cố chạy một lệnh yêu cầu SDK thì nó sẽ thất bại

Tôi giả sử, trong vùng chứa, f93fb2962a1eđang sử dụng hình ảnh được tạo bởi tệp docker mà bạn đã đăng trong câu hỏi


Tôi không vào chủ đề rất sâu sắc. Bạn có thể giải thích chi tiết hơn làm thế nào để giải quyết vấn đề được mô tả của bạn?
Jonathan Stellwag

1

getcwd()lỗi, có nghĩa là giải pháp bị mất bối cảnh vào đường dẫn. Tôi thấy rằng việc loại bỏ hoàn toàn dock-composegiải pháp và tệp Dockerfile liên quan khỏi dự án đã khắc phục vấn đề. Đó là hacky nhưng hoạt động nếu bạn đang ở trong một ràng buộc.


0

Tôi tin rằng thư mục làm việc hiện tại của bạn đã bị xóa hoặc đường dẫn đến thư mục làm việc đã được đặt lại. Nhưng nó sẽ là tùy chọn đầu tiên vì bản cập nhật của VS có thể xóa thư mục /tmptrên máy docker của bạn để nó không còn ở đó nữa và nó sẽ được tạo trong một số sự kiện bên ngoài.

Hoặc đặt cổng để chặn kết nối với máy docker của bạn.

  1. Kiểm tra kết nối với máy docker
  2. Kiểm tra sự tồn tại của thư mục được sử dụng làm thư mục làm việc trên máy docker

Nếu bạn không tìm thấy vấn đề thì hãy tiếp tục với điều này:

docker exec --it {containerID} /bin/sh

bạn có thể sử dụng bài viết gỡ lỗi docker chính thức này với điều này, hãy làm theo các thư mục mà docker đang cố truy cập và kiểm tra sự tồn tại của chúng.

Với việc gỡ lỗi này, bạn có thể phát hiện ra các vấn đề.

Tôi hy vọng nó đã giúp bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.