DockerでVSから実行しようとすると、エラー「getcwd()が失敗しました:そのようなファイルまたはディレクトリはありません」


8

docker-composeを使用してDockerでローカルに実行するように設定されたプロジェクトがあります。最近まで、問題なく動作しています。私はこれに影響するはずの何かを変更したとは思わない(おそらくVSのアップグレードを除いて?)、そして古いコミットにロールバックすることを試みた。すべての場合において、Visual Studioの出力ウィンドウに次のように表示されるエラーメッセージが表示されます。

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

さまざまな方法(Dockerファイルのベースイメージの変更、古いイメージとコンテナーの削除など)を試しましたが、同じエラーメッセージが表示され続けます。奇妙なことに、[ファイル]> [新規]を実行すると、Visual Studioは非常によく似たDockerファイルを生成し、正常に動作します。問題が何であるかはわかりませんが、ここの誰かがそれを見つけられることを望んでいます。

私の完全なリポジトリはGithubで入手できます。これが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"]

そして、ソリューションのためのdocker-compose(Couchbaseのものがない場合でも同じエラーが発生しますが、完全を期すためにここに貼り付けています):

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
昨夜私は誰かとペアを組んで、コマンドラインからすべてがうまくいくようです。そして、すべてがVisual Studioから彼のためにうまくいきました。この時点で、Visual Studioを吹き飛ばすことが解決策になると思います。
マシューグローブ

あなたのリポジトリは再現可能ではありません。ユーザーエラーが発生します。次に、証明書の発行。私はそれを機能させることができませんでした。では、なぜVSが問題になるのでしょうか。コードはコンテナ内で実行されます。
suren

このペアリングセッションのため、私はVSを疑った。コマンドラインからdocker-composeを実行できましたが、正常に動作しているように見えました(getcwdエラーは発生しませんでした)。「私のレポは再現できません」と言うとき、どういう意味ですか?どのエラーが発生しましたか?証明書の問題は発生していません。私のペアも同様です。「ユーザーエラー」(例外?)は、twitch資格情報を入力しなかったことが原因である可能性があります。つまり、私と同じ問題が発生していません。
マシューグローブ

回答:


3

コメントするほどの評判はありませんが、あなたの.csprojファイルの可能性があります。Visual Studioをアップグレードしたとのことですが、.csprojファイルにはプロジェクトに関する情報(システムアセンブリへの参照を含む)が含まれており、それをDockerfileにコピーしているため、次のことが可能です。

  1. VSを更新した後、.csprojファイルを更新する必要があります。
  2. dockerfileの「FROM」ステートメントのdotnetコアバージョンは、ローカルで使用しているバージョンとは異なります。

新しいプロジェクトを開始してソースを追加することでこれをテストし、古い.csprojファイルと新しい.csprojファイルを比較してください。元のファイルをバックアップして、.csprojファイルを手動で変更してみることもできます。vs2015のcsprojファイルをvs2017にアップグレードする方法を示すブログ投稿を見つけました。うまくいけば、それが役立ちます。


私のVSアップグレードはマイナーなものでした:16.4.3から16.4.4へ。新しいプロジェクトと差分を試したと思いますが、何も気づきませんでした。お返事ありがとうございます。もう一度やり直す価値があります。
マシューグローブ

1
@MatthewGrovesすみません、これ以上助けられませんでした。頑張って。
jaymac18

1

評判が足りないので、コメントはできません。しかし、私を困惑させる1つのことは、.Net SDKがないイメージをベースイメージとして使用しているという事実であり、SDKを必要とするコマンドを実行しようとすると失敗するように見えます

コンテナーf93fb2962a1eで、質問で投稿したdockerファイルによって作成された画像を使用していると思います


私はこのトピックにはあまり詳しくありません。記述された問題を解決する方法をより詳細に説明できますか?
ジョナサンステルワグ

1

getcwd()エラーは、ソリューションがパスへのコンテキストを失ったことを意味します。dock-composeソリューションと関連するDockerfileファイルをプロジェクトから完全に削除すると、問題が解決することがわかりました。それはハックですが、束縛されている場合に機能します。


0

現在の作業ディレクトリが削除されたか、作業ディレクトリへのパスがリセットされたと思います。しかし、VSを更新すると/tmpDockerマシン上のディレクトリが削除される可能性があるため、これは最初のオプションになります。そのため、もう存在せず、外部イベントで作成されます。

または、Dockerマシンへの接続をブロックするようにポートを設定します。

  1. Dockerマシンへの接続を確認する
  2. Dockerマシンの作業ディレクトリとして使用されているフォルダの存在を確認します

問題が見つからなかった場合は、これを続行します。

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

これを使用して、この公式のdocker デバッグ記事 を使用できます。dockerがアクセスしようとしているディレクトリをたどって、その存在を確認してください。

このデバッグにより、問題を発見できるはずです。

お役に立てば幸いです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.