web-dev-qa-db-ja.com

Docker-composeがローカルファイルをコンテナーにコピーできないのはなぜですか

VS2017でdocker-composeをサポートするシンプルなDotnetCoreアプリケーションを構築しています。

2つのDockerfileがあり、1つはアプリ用、もう1つはNGINXプロキシ用です。その上に、これらの両方を一緒にラップするdocker-compose.ymlファイルがあります。

これはaspnetcoreアプリのDockerfileです。そこには多くのCOPYステートメントがあり、すべて正しく動作します!

FROM Microsoft/dotnet:2.0-runtime AS base
WORKDIR /app

FROM Microsoft/dotnet:2.0-sdk AS build
WORKDIR /src
COPY CoreServer.sln ./
COPY CoreServer/CoreServer.csproj CoreServer/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/CoreServer
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

これはnginx Dockerfileであり、ファイルを適切にコピーできません。代わりに、次のエラーを出力します。

コピーに失敗しました:stat /var/lib/docker/tmp/docker-builder780242597/nginx.conf:そのようなファイルまたはディレクトリはありません。 #1859

FROM nginx

WORKDIR /etc/nginx

COPY nginx.conf ./
COPY server.crt ./
COPY server.key ./

このDockerfileを単独でビルドしてみましたが、動作しますが、docker-composeを使用すると上記のエラーが発生します。

これはdocker-compose.ymlファイルがどのように見えるかです

version: '3'

services:
  coreserver:
    image: coreserver
    build:
      context: .
      dockerfile: CoreServer/Dockerfile
    expose:
      - "5000"

  nginx:
    build: 
      context: .
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
      - "443:443"
    links:
      - coreserver

完全なプロジェクトを確認したい場合は、サーバーとクライアントアプリケーションを備えたdotnetcore websocketサーバーテストアプリケーションです。

https://github.com/avboivin/WssCoreServer/tree/master/server

誰かがdocker sendにこの特定のエラーを与えるように私が間違っていることを教えてもらえますか?

3
A_V

これはバグのようです。

私はここで解決策を見つけました:

https://github.com/docker/for-mac/issues/1922#issuecomment-355364451

これは、問題が発生していたDockerfileをdocker-compose.yamlファイルのルートレベルで移動しただけです。

2
A_V

https://docs.docker.com/engine/reference/builder/#copy から。言う:

COPYは次の規則に従います。

  • [src]パスはビルドのコンテキスト内にある必要があります。 ../something/somethingをコピーすることはできません。Dockerビルドの最初のステップは、コンテキストディレクトリ(およびサブディレクトリ)をdockerデーモンに送信することです。

  • [src]がディレクトリの場合、ファイルシステムメタデータを含め、ディレクトリの内容全体がコピーされます。

バグではありません。 COPYは絶対パスからファイルを読み取ることができません。

したがって、解決策は、source dir/filesと同じディレクトリにdocker-compose.ymlを作成して実行することです。

4
guhkun13