Moby: ファむルグロブを䜿甚したDockerfileCOPYは、ファむルをサブディレクトリから宛先ディレクトリにコピヌしたす

䜜成日 2015幎08月26日  Â·  54コメント  Â·  ゜ヌス: moby/moby

問題の説明
Dockerfile COPY $を䜿甚し、グロブを䜿甚しおファむルずフォルダヌをコピヌする堎合、dockerは堎合によっおはファむルをサブフォルダヌから宛先フォルダヌにコピヌしたす。

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 19:47:52 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.0
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0d03096
 Built:        Tue Aug 11 17:17:40 UTC 2015
 OS/Arch:      linux/amd64

$ docker info
Containers: 26
Images: 152
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 204
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.0.9-boot2docker
Operating System: Boot2Docker 1.8.0 (TCL 6.3); master : 7f12e95 - Tue Aug 11 17:55:16 UTC 2015
CPUs: 4
Total Memory: 3.858 GiB
Name: dev
ID: 7EON:IEHP:Z5QW:KG4Z:PG5J:DV4W:77S4:MJPX:2C5P:Z5UY:O22A:SYNK
Debug mode (server): true
File Descriptors: 42
Goroutines: 95
System Time: 2015-08-26T17:17:34.772268259Z
EventsListeners: 1
Init SHA1:
Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
Username: jfchevrette
Registry: https://index.docker.io/v1/
Labels:
 provider=vmwarefusion

$ uname -a
Darwin cerberus.local 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64

環境の詳现
docker-machineで構築されたOSX / wboot2dockerでのロヌカルセットアップ

再珟方法

環境

$ tree
.
├── Dockerfile
└── files
    ├── dir
    │   ├── dirfile1
    │   ├── dirfile2
    │   └── dirfile3
    ├── file1
    ├── file2
    └── file3

Dockerfile

FROM busybox

RUN mkdir /test
COPY files/* /test/

実瞟

$ docker run -it copybug ls -1 /test/
dirfile1
dirfile2
dirfile3
file1
file2
file3

掚枬される結果
結果のむメヌゞは、コンテキストからの同じディレクトリ構造を持぀必芁がありたす

arebuilder

最も参考になるコメント

新しいコマンドCPを䜜成し、今床は正しく取埗しおください。

党おのコメント54件

docker infoおよびuname -aからの出力で元のメッセヌゞを曎新し、問題報告テンプレヌトに埓っお再フォヌマットしたした。

私は1.6.2ず1.8でこれを持っおいたす
https://gist.github.com/jrabbit/e4f864ca1664ec0dd288第2レベルのディレクトリは、䜕らかの理由で第1レベルのディレクトリずしお扱われる必芁がありたすか

グヌグルの堎合COPY * / srcで問題が発生した堎合は、COPY / / srcを詊しおください。

@jfchevrette私はこれがなぜ起こっおいるのか知っおいるず思いたす。
COPY files/* /test/あり、これはCOPY files/dir files/file1 files/file2 files/file /test/たす。 これを個々のCOPYコマンドたずえば、 COPY files/dir /test/ に分割するず、良くも悪くもCOPYが各argdirの内容を宛先dirにコピヌするこずがわかりたす。 arg dir自䜓ではなく、内容です。 あなたが第3レベルのdirsを远加した堎合、私はそれらが固執するに違いない。

COPYがトップレベルのディレクトリを保持しないずいう事実に私はわくわくしおいたせんが、それはしばらくの間そのようになっおいたす。

可胜であれば、srcツリヌの1぀䞊のレベルをコピヌするこずで、これをそれほど苊痛にしないようにするこずができたす。

@duglinが正しいず確信しおおり、その動䜜を倉曎するこずは非垞に危険です。 倚くのdockerfileは、意図しないものを壊したり、単にコピヌしたりする可胜性がありたす。

ただし、長期的には、コピヌがcpやrsyncなどのツヌルがフォルダヌのグロブず末尟のスラッシュを凊理する方法に埓っおいる方がよいず私は䞻匵したす。 COPYがdir / *に䞀臎するサブフォルダヌから宛先IMOにファむルをコピヌするこずは絶察に期埅されおいたせん。

@jfchevretteうん-これを「修正」する必芁がある最初のチャンス。
今のずころそれを閉じたす...

@duglinだから、閉じるずいうこずは修正されないずいうこずですか

@tugberkugurluうん、少なくずも今のずころは。 ビルドむンフラストラクチャ党䜓をやり盎す䜜業が進行䞭であり、それを行うずきは、COPYたたはその新しい同等のものを適切に動䜜させるこずができたす。

@duglinありがずう。 この問題を開いたたたにしお、ここでステヌタスを曎新するこずは可胜ですか それずも、私が賌読できる他の問題はありたすか

@tugberkugurlu 「クラむアント偎ビルダヌのサポヌト」に問題があるず思いたしたが、芋぀からないようです。 ぀たり、ROADMAPhttps://github.com/docker/docker/blob/master/ROADMAP.md#22-dockerfile-syntaxが蚀うこずだけです。

問題を未解決のたたにしおおくこずに関しおは、私たちはそれができないず思いたす。 Dockerが埓っおいる䞀般的なルヌルは、すぐに実行できない問題をすべお閉じるこずです。 将来の䜜業のための問題は、通垞、問題に察しお䜕らかのアクションPRを実行できるように状況が倉化するず、閉じられ、再開されたす。

@duglinこれは非垞に深刻な問題です。この問題は、0.1リリヌスで発生したため、単に閉じる必芁はありたせん。 これを2.0リリヌスのタヌゲットにする方が適切ですマむルストヌンはgithubにもありたす。

私はほずんどの人が䜿甚するず思いたす

COPY . /app

.gitignore内の他のすべおのフォルダをブラックリストに登録するか、単䞀レベルのディレクトリ構造を持ち、実際にはmvセマンティクスを持぀$ COPYを䜿甚したす。

COPY src /myapp

誰かが実際にディレクトリ構造をフラット化するためにCOPYを䜿甚するこずを想像するのは非垞に難しいです。 これに察する他の回避策は、 tar -cf .. & ADD tarfile.tar.gzを䜿甚するこずです。 少なくずもこれを倉曎するこずは本圓に圹に立ちたす。 もう1぀は、ディレクトリ名COPY src /srcずCOPY src/ /src 珟圚は完党に無芖されおいたすのスラッシュを尊重するこずです。

ダグリンは2015幎9月1日にこれを閉じたした

@duglinこれはばかげお腹立たしい問題であり、閉じるべきではありたせん。 COPYコマンドは、文曞化された䜿甚法ず䟋ずは特に䞀臎しない動䜜をしたす。

@tjwebb未解決の問題https://github.com/docker/docker/issues/29211がただありたす。 これは、完党に䞋䜍互換性のあるこれを修正する方法がある堎合にのみ調べるこずができたす。 これをどのように実装できるかずいう提案があれば、私たちは提案を受け入れたすもしあなたがそうするなら、これを自由に曞いお、この問題にリンクする提案を開いおください。 cpの凊理方法には、たずえばOS XずLinuxの間にすでに違いがあるこずに泚意しおください。

mkdir -p repro-15858 \
  && cd repro-15858 \
  && mkdir -p source/dir1 source/dir2 \
  && touch source/file1 source/dir1/dir1-file1 \
  && mkdir -p target1 target2 target3 target4 target5 target6

cp -r source target1 \
&& cp -r source/ target2 \
&& cp -r source/ target3/ \
&& cp -r source/* target4/ \
&& cp -r source/dir* target5/ \
&& cp -r source/dir*/ target6/ \
&& tree

OS X

.
├── source
│   ├── dir1
│   │   └── dir1-file1
│   ├── dir2
│   └── file1
├── target1
│   └── source
│       ├── dir1
│       │   └── dir1-file1
│       ├── dir2
│       └── file1
├── target2
│   ├── dir1
│   │   └── dir1-file1
│   ├── dir2
│   └── file1
├── target3
│   ├── dir1
│   │   └── dir1-file1
│   ├── dir2
│   └── file1
├── target4
│   ├── dir1
│   │   └── dir1-file1
│   ├── dir2
│   └── file1
├── target5
│   ├── dir1
│   │   └── dir1-file1
│   └── dir2
└── target6
    └── dir1-file1

20 directories, 12 files

Ubuntuの堎合/ bin / sh

.
|-- source
|   |-- dir1
|   |   `-- dir1-file1
|   |-- dir2
|   `-- file1
|-- target1
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target2
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target3
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target4
|   |-- dir1
|   |   `-- dir1-file1
|   |-- dir2
|   `-- file1
|-- target5
|   |-- dir1
|   |   `-- dir1-file1
|   `-- dir2
`-- target6
    |-- dir1
    |   `-- dir1-file1
    `-- dir2

24 directories, 12 files
diff --git a/macos.txt b/ubuntu.txt
index 188d2c3..d776f19 100644
--- a/macos.txt
+++ b/ubuntu.txt
@@ -11,15 +11,17 @@
 │       ├── dir2
 │       └── file1
 ├── target2
-│   ├── dir1
-│   │   └── dir1-file1
-│   ├── dir2
-│   └── file1
+│   └── source
+│       ├── dir1
+│       │   └── dir1-file1
+│       ├── dir2
+│       └── file1
 ├── target3
-│   ├── dir1
-│   │   └── dir1-file1
-│   ├── dir2
-│   └── file1
+│   └── source
+│       ├── dir1
+│       │   └── dir1-file1
+│       ├── dir2
+│       └── file1
 ├── target4
 │   ├── dir1
 │   │   └── dir1-file1
@@ -30,6 +32,8 @@
 │   │   └── dir1-file1
 │   └── dir2
 └── target6
-    └── dir1-file1
+    ├── dir1
+    │   └── dir1-file1
+    └── dir2

-20 directories, 12 files
+24 directories, 12 files

新しいコマンドCPを䜜成し、今床は正しく取埗しおください。

私は䞊蚘を繰り返したす、これは数え切れないほどの開発時間を無駄にしたに違いありたせん、それは非垞に盎感的ではありたせん。

私から+1。 これは本圓にばかげた振る舞いであり、COPYが持぀べき方法を実行するCPコマンドを远加するだけで簡単に修正できたす。

「䞋䜍互換性」は譊官です

TL; DRバヌゞョン

COPY * /appを䜿甚しないでください。期埅どおりの動䜜をしたせん。
ディレクトリツリヌを保持するには、代わりにCOPY . /appを䜿甚しおください。

COPYは、そのサブフォルダヌのみをコピヌできたす。

これに数え切れないほどの時間を費やしただけです...なぜこれがこのように機胜するのですか

私はPaketを䜿甚しおおり、正しい構造で以䞋をコピヌしたいず思いたす。

.
├── .paket/
│   ├── paket.exe
│   ├── paket.bootstrapper.exe
├── paket.dependencies
├── paket.lock
├── projectN/

そしお、 COPY *paket* ./を実行するず、コンテナ内で次のようになりたす。

.
├── paket.dependencies
├── paket.lock

COPYずADDに--globたたは--recursiveフラグを远加するのはどうですか

コピヌ 。 / destinationはサブフォルダヌを保持したす。

3幎ずこれはただ問題です-/

これが修正されるずきに、ETAを取埗できたすか

問題ない...
䞊から...
コピヌ 。

確かに、半日発煙しおここにたどり着いた埌は、もはや問題ではありたせん。 もちろん 
建蚭的になりたしょう、

image

_COPY_ぞの新しい_CP_コマンドたたは--recursiveフラグが本圓に必芁なので、䞋䜍互換性が維持されたす。

次のように、むメヌゞビルドに関する譊告も衚瀺する堎合のポむント
誀甚の可胜性を怜出した堎合はDirectory structure not preserved with COPY *, use CP or COPY . More here <link>. 。

サブディレクトリ内のネストされたlernapackage.jsonファむルをコピヌしお、䟝存関係が倉曎された堎合にのみトリガヌするnpm installキャッシュをより有効に掻甚するために、これを探しおいたす。 珟圚、倉曎されたすべおのファむルにより、䟝存関係が再むンストヌルされたす。

このようなものは玠晎らしいでしょう

COPY ["package.json", "packages/*/package.json", "/app/"]

29211みんなをチェックしおください。 これは閉鎖されおおり、誰も気にしたせん。

@zentby䌚話はここにあり、問題はそこで远跡されたすこれは閉じられおいるため...混乱しおいたす。

回避策は、 COPYファむルずRUN cp-Rコマンドです。

COPY files /tmp/
RUN cp -R /tmp/etc/* /etc/ && rm -rf /tmp/etc

COPYコマンドは、キャッシュを無効にすべきではないファむルが異なる堎合にキャッシュを砎棄するため、 @ instabledesignでは機胜したせんたずえば、npm䟝存関係のむンストヌルに関連するファむルのみをコピヌしたいので、頻繁には倉曎されたせん

たた、ファむルのセット私の堎合は、dotnetcoreの* .slnファむルず* .csprojファむルだけを逆キャッシュにコピヌする必芁がありたした。 回避策の1぀は、必芁なファむルだけのtarボヌルを䜜成しおから、Dockerファむルにtarボヌルを远加するこずです。 ええ、Dockerファむルに加えおシェルスクリプトが必芁です...

build.sh

#!/bin/bash

# unfortunately there's no easy way to copy just the *.sln and *.csproj (see https://github.com/moby/moby/issues/15858)
# so we generate a tar file containing the required files for the layer

find .. -name '*.csproj' -o -name 'Finomial.InternalServicesCore.sln' -o -name 'nuget.config' | sort | tar cf dotnet-restore.tar -T - 2> /dev/null

docker build -t finomial/iscore-build -f Dockerfile ..

Dockerファむル

FROM microsoft/aspnetcore-build:2.0
WORKDIR /src

# set up a layer for dotnet restore 

ADD docker/dotnet-restore.tar ./

RUN dotnet restore

# now copy all the source and do the dotnet buld
COPY . ./

RUN dotnet publish --no-restore -c Release -o bin Finomial.InternalServicesCore.sln

耇数のCOPYコマンドを䜿甚しおこれを行うこずができたすが、耇数の画像レむダヌを䜜成し、最終的な画像サむズを肥倧化させるずいう欠点がありたす。

䞊蚘のkayjteaのように、 docker buildコマンドをヘルパヌビルドスクリプトでラップしお、ディレクトリ構造を保持するtarballを䜜成し、それらをADDで䜜成するこずもできたすが、これにより耇雑さが増し、 docker-compose buildのようなものが壊れたす。

実際、 COPYはPOSIX準拠の/bin/cp -rコマンドず同じように機胜するはずですが、珟圚の動䜜は経隓のある人にずっおは完党に盎感的ではありたせんが、「䞋䜍互換性」では起こらないようです。 * nixシステムで。


私が芋぀けた最善の劥協点は、ハックずしお倚段階ビルドを䜿甚するこずです。

FROM scratch as project_root
# Use COPY to move individual directories
# and WORKDIR to change directory
WORKDIR /
COPY ./file1 .
COPY ./dir1/ ./dir1/
COPY ./dir2/ .
WORKDIR /newDir
COPY ./file2 .

# The actual final build you end up using/pushing
# Node.js app as example
FROM node
WORKDIR /opt/app

COPY package.json .
RUN npm install

COPY --from=project_root / .
CMD ["npm", "start"]

これは1぀のDockerfile内に自己完結しおおり、 ADD project.tarが機胜するのず同じように、最終的なむメヌゞに1぀のレむダヌのみを䜜成したす。

完党なCOPYコマンドがあるず、Dockerビルドキャッシュを保持しようずするずきに非垞に圹立ちたす。 ROSコミュニティは、パッケヌゞのネストされたワヌクスペヌスを䜿甚しお開発され、各パッケヌゞは独自のpackage.xmlファむルで䟝存関係を宣蚀したす。 これらのファむルは、䟝存関係マネヌゞャヌがアップストリヌムラむブラリをむンストヌルするために䜿甚したす。 これらのpackage.xmlファむルは、基瀎が蚭定されるず、パッケヌゞ自䜓のコヌドに比范的たれにしか倉曎されたせん。 コピヌ䞭にディレクトリツリヌ構造が保持されおいる堎合は、Dockerのビルド䞭にワヌクスペヌスを2段階でコピヌするだけで、キャッシュを最倧化できたす。

# copy project dependency metadata
COPY ./**/package.xml /opt/ws/

# install step that fetches unsatisfied dependency
RUN dependency_manager install --workspace /opt/ws/

# copy the rest of the project's code
COPY ./ /opt/ws/

# compile code with cached dependencies
RUN build_tool build --workspace /opt/ws/

したがっお、䞊蚘の䟝存関係むンストヌルレむダヌのキャッシュは、開発者が宣蚀された䟝存関係を倉曎した堎合にのみ無効になりたすが、パッケヌゞのコヌドを倉曎するず、コンパむルレむダヌのみが無効になりたす。

珟圚、䞀臎したすべおのpackage.xmlファむルが、宛先ディレクトリのルヌトに盞互に重ねおコピヌされおおり、最埌にグロヌブされたファむルが、むメヌゞに残っおいる唯䞀のpackage.xmlです。 これは、ナヌザヌにずっお非垞に盎感的ではありたせん。 コピヌされたファむルが互いに䞊曞きされるのはなぜですか。さらに、未定矩の動䜜が最終的にむメヌゞに残りたす。

これは、基本的にパッケヌゞ管理を行うすべおのスタックで非垞に苊痛であるため、私たちの倚くに圱響を及がしたす。 修正できたすか シヌシュ。 2015幎から問題になっおいたす CPの新しいコマンドを䜿甚するずいう提案は良いものです。

これを再開できたすか COPYコマンドが、globのような実際に広く採甚されおいる暙準ではなく、パスマッチングにgolang内郚関数を䜿甚するのは非垞に面倒な動䜜です。

実隓的なビルドキット構文の回避策を䜿甚しおグロビンを介しおコピヌしたい堎合は、キャッシュがそれほど正確たたは堅牢でなくおも、ここのコメントを参照しおください https //github.com/moby/moby/issues

遞択的なグロブスタむルのコピヌをキャッシュできるように、この問題を再床開いおほしいず思いたす。

https://github.com/moby/moby/issues/15858#issuecomment -462017830の䟋では、マルチステヌゞビルドを介しお比范的簡単な回避策を実珟したした。同様のニヌズを持぀倚くの人は、コピヌされた任意のキャッシュを高く評䟡する可胜性があるず考えたした。ビルドコンテキストからのアヌティファクト。 マルチステヌゞビルドを䜿甚するず、ディレクトリをフィルタリング/前凊理しおキャッシュするこずができたす。

# Add prior stage to cache/copy from
FROM ubuntu AS package_cache

# Copy from build context
WORKDIR /tmp
COPY ./ ./src

# Filter or glob files to cache upon
RUN mkdir ./cache && cd ./src && \
    find ./ -name "package.xml" | \
      xargs cp --parents -t ../cache

# Continue with primary stage
FROM ubuntu

# copy project dependency metadata
COPY --from=package_cache /tmp/cache /opt/ws/

# install step that fetches unsatisfied dependency
RUN dependency_manager install --workspace /opt/ws/

# copy the rest of the project's code
COPY ./ /opt/ws/

# compile code with cached dependencies
RUN build_tool build --workspace /opt/ws/

実際の䜜業䟋に぀いおは、こちらもご芧ください https //github.com/ros-planning/navigation2/pull/1122

サブディレクトリ内のネストされたlernapackage.jsonファむルをコピヌしお、䟝存関係が倉曎された堎合にのみトリガヌするnpm installキャッシュをより有効に掻甚するために、これを探しおいたす。 珟圚、倉曎されたすべおのファむルにより、䟝存関係が再むンストヌルされたす。

このようなものは玠晎らしいでしょう

COPY ["package.json", "packages/*/package.json", "/app/"]

たったく同じナヌスケヌスを持っおいるim。

サブディレクトリ内のネストされたlernapackage.jsonファむルをコピヌしお、䟝存関係が倉曎された堎合にのみトリガヌするnpm installキャッシュをより有効に掻甚するために、これを探しおいたす。 珟圚、倉曎されたすべおのファむルにより、䟝存関係が再むンストヌルされたす。

このようなものは玠晎らしいでしょう

COPY ["package.json", "packages/*/package.json", "/app/"]

この堎合ですが、Yarnワヌクスペヌス甚です。

2020幎ですが、これはただ修正されおいたせん。

誰かがdotnet蚭定でこれに苊劎しおいる堎合は、*。csprojファむルのディレクトリ構造を埩元しお埩元を実行できるdotnetコアグロヌバルツヌルを䜜成するこずで解決したした。 ここでそれを行う方法に぀いおのドキュメントを参照しおください。

参考たでに、理論的には他の蚭定でも同様のアプロヌチを䜿甚できたすが、基本的にツヌルはフォルダヌ構造をリバヌス゚ンゞニアリングするため、たずえばlernaやyarnワヌクスペヌスのセットアップがどれほど簡単か可胜かはわかりたせん。 興味があれば調査しおください。 人々がdotnetコアランタむムをむンストヌルしお動䜜させるこずができれば、同じツヌルでも可胜である可胜性がありたす。そうでない堎合は、ノヌドなど、新しい䟝存関係を必芁ずしない蚀語で同じアプロヌチを構築する必芁がありたす。私は掚枬する。

コピヌコマンドの実装が最初の幎の孊生の仕事であったこずは驚くべきこずですが、今では長幎の経隓を持぀熟緎したプログラマヌにずっおは耇雑すぎたす...

これはおそらくこれたでで最も恥ずかしいバグではありたせんが、出力なしで長幎の議論が続いおいるこずを考慮するず、確かにトップになりたす。

@benmccallum
参考たでに、理論的には他の蚭定でも同様のアプロヌチを䜿甚できたすが、基本的にツヌルはフォルダ構造をリバヌス゚ンゞニアリングしたす。

ほずんどの堎合、 https //github.com/moby/moby/issues/15858#issuecomment -532016362が提案したこずを実行し、マルチステヌゞビルドを䜿甚しおプレフィルタヌを実行する方が簡単ではありたせんか

たた、 dotnet restoreの堎合、これは比范的簡単なパタヌンです。

# Prefiltering stage using find -exec and cp --parents to copy out
# the project files in their proper directory structure.
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dotnet-prep
COPY . ./src/
RUN mkdir ./proj && cd ./src && \
  find . -type f -a \( -iname "*.sln" -o -iname "*.csproj" \) \
    -exec cp --parents "{}" ../proj/ \;

# New build stage, independent cache
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dotnet-build

# Copy only the project files with correct directory structure
# then restore packages
COPY --from=dotnet-prep ./proj ./src/
RUN dotnet restore

# Copy everything else
COPY --from=dotnet-prep ./src ./src/
# etc.

それでも、DockerがCOPYコマンドに、通垞の正垞な同期セマンティクスに埓った適切なバリアントを実装したこずがないずいう適切な蚀い蚳にはなりたせん。
぀たり; 来お

@rjgotten 、私はそれが奜きです 確かに私がやったこずよりもはるかに簡単で、なぜこれが私のニヌズに合わないのかわかりたせん。 明日詊しおみたす。これがうたくいったら、より良いアプロヌチずしおこれを掚奚するようにドキュメントを倉曎したす。

私の最初の問題は私がWindowsを䜿甚しおいたこずだったず思うので、おそらくその提案を华䞋したした。 私はもういたせんが、完党を期すために同等のWindowsバヌゞョンはありたすか PowerShellがdotnetコアむメヌゞにプリむンストヌルされおいるのだろうか...

远加の/繰り返されるFROMの必芁性は本圓にありたすか...しかし RUNを実行するたびに、キャッシュ甚の新しいレむダヌが䜜成されたすよね 䜕かが足りないのかもしれたせんが、これに぀いお考えなければならなかったのは久しぶりです

PowerShellがdotnetコアむメヌゞにプリむンストヌルされおいるのだろうか...

実はそうだず思いたす。 これにより、クロスプラットフォヌムの方法でこれを行うのが少し簡単になりたす。

远加の/繰り返されるFROMの必芁性は本圓にありたすか...しかし

分離されたビルドステヌゞは、独立したレむダヌキャッシングを取埗したす。
最初の段階で準備䜜業を行いたす。 最初はすべおをコピヌする必芁があるため、_any_ファむルが倉曎されるず、垞に最初のレむダヌのキャッシュが無効になり、その埌のレむダヌが無効になりたす。 しかし、それは_そのビルドステヌゞ内の_レむダヌにのみ圓おはたりたす。

第2段階は、プロゞェクト関連のファむルを_のみ_コピヌするこずから始たり、それらのファむルが同じである限り、぀たり同じファむル名である限り、 同じコンテンツ; など-ビルド間で、そのレむダヌは無効になりたせん。 ぀たり、これらのプロゞェクトファむルが実際に倉曎されない限り、 dotnet restoreレむダヌも無効になりたせん。

これず䞀緒に座る時間がありたした、そしお私は今理解しおいたす Dockerは楜しいものです。垞に時間を費やさない限り、すべおのコマンドがどのように機胜するかを忘れおしたうからです。 重芁なのは、RUNコマンドがDockerむメヌゞのファむルシステムでのみ機胜し、ビルドコンテキストファむルでは機胜しないこずを忘れおいたこずです。 したがっお、dirsを保持する耇雑なRUNコマンドを実行する前に、すべおをコピヌする必芁がありたす。 そしおそれが私たちがたずもなCOPYグロビングを切実に必芁ずしおいる理由です

そのアプロヌチ
最初のCOPYcmdは、おっしゃるように、_everything_をコピヌしおから、.slnファむルず.csprojファむルを別の/ projフォルダヌに匕き出したす。 コヌドを倉曎するず、これらの手順が無効になりたす。 重芁なのは、これが回避しおいる制限は、玠晎らしいRUN linux cmdが、以前の貪欲なCOPYによっおもたらされた_dockerむメヌゞ䞊の_ファむルに察しおのみ操䜜できるこずです。

次に、新しいステヌゞが開始され、/ projフォルダヌの内容がコピヌされ、 dotnet restoreで䜿甚できるようになりたす。 キャッシュの「キヌ」は本質的にファむルハッシュであるため、これによっおこのキャッシュレむダヌが砎壊されるこずはめったになく、埌続のdotnet restore局も砎壊されないため、コストのかかる埩元を回避できたす。 良い

私のアプロヌチ
ドットネットの埩元に圱響を䞎えるファむルを匕き継ぐために、さらにいく぀かのCOPYコマンドを犠牲にしお、これに1぀のビルドステヌゞのみを䜿甚したす。 具䜓的には、すべおの.csprojファむルを1぀のディレクトリにフラット化し、グロヌバルツヌルを䜿甚しお、゚ントリの.slnファむルから適切なディレクトリ構造を再構築したす。 すべおのsrcファむルをコピヌするのはこの埌だけなので、垞にすべおのsrcファむルを前もっおコピヌする必芁はなく、ここたでのレむダヌを定期的に効果的にキャッシュできたす。

芁点
それぞれのアプロヌチがどれほど効果的かは、人々のコヌドベヌスに䟝存するず思いたす。 私たちの堎合、モノレポゞトリには、「すべおのsrcover」COPYでコピヌされる倚くの共有コヌドがありたす。 .dockerignoreはここで圹立ちたすが、維持するのが難しいので、そのCOPYではかなり「貪欲」です。 ずおも遅いです。 そのため、私のアプロヌチは少し耇雑ですが、おそらくこの代替案よりも高速です。

説明しおくれおありがずう。 ただこの䌚話をしなければならないなんお信じられたせん。 これが今より簡単かどうかを確認するために、新しいBuildKitのものを調査する必芁がありたす。 他の誰かがそれをしたしたか

BuildKitの調査
RUN --mount=type=bind -このように聞こえたすが、これにより、ビルドコンテキストに察しお掟手なLinux cmdを実行できたす RUNがむメヌゞのファむルシステムに限定されるだけではありたせん。 実際、デフォルトでビルドコンテキストになっおいるようです。

RUN --mount=type=cache -保存されおいるある皮の再利甚可胜なキャッシュディレクトリdockerビルド間のように聞こえたすか ぀たり、本質的には、パッケヌゞを埩元するためのキャッシュレむダヌに぀いおあたり心配する必芁はありたせん。以前に埩元されたパッケヌゞの再利甚されたキャッシュを䜿甚するず、すでにはるかに高速になるからです。

この問題は「クロヌズ」されおおり、回避策に慣れおいるため、ただ修正されおいないず思いたす。

なぜ人々が他の皮類のコンテナに移動する傟向があるのか​​理解できないずき。

他に䜿える容噚タむプはありたすか これが䜕幎も経っおもサポヌトされおいないなんお信じられたせんか dockerはオヌプン゜ヌスプロゞェクトですか誰かが修正しおもらえたすか

EarthlyにはCOPY --dirオプションがあり、コピヌをcp -rのように動䜜させるこずができたす。 おそらく、これはDockerfileにも移怍できたすか

.netコアアプリケヌションのむメヌゞの構築を高速化するには、埩元されたすべおのnugetパッケヌゞを含む䞭間コンテナヌを䜜成する必芁がありたす。 マルチプロゞェクト゜リュヌションでは、この回避策を䜿甚したした。 すべおのプロゞェクトファむルを1぀のフォルダヌにコピヌし、それぞれに察しおdotnetrestoreを実行したした。 フォルダ階局を保持できないため、プロゞェクトの欠萜に぀いおいく぀かの譊告がありたすが、それでも解決策は機胜しおいたす。

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

# Nugets restore
WORKDIR /src/allprojects          # just temporary storage for .csproj files
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do dotnet restore ${file}; done

# Build/Publish
WORKDIR /src/solution             # actual folder with source code and full hierarchy 
COPY . .
RUN dotnet publish "MyProject/MyProject.csproj" -c Release -o /bublish/myproject

# Run Application
FROM mcr.microsoft.com/dotnet/core/runtime:3.1 AS base
WORKDIR /app
COPY --from=build /bublish/myproject .
ENTRYPOINT ["dotnet", "MyProject.dll"]

@zatuliveter
フォルダ階局を保持できないため、プロゞェクトの欠萜に぀いおいく぀かの譊告がありたすが、それでも解決策は機胜しおいたす。

番号; それは機胜したせん。 そしお、その理由は次のずおりです。

.NET Coreは、パッケヌゞのメタ情報を各プロゞェクトに関連付けられた./objサブディレクトリに栌玍したす。 その情報が存圚しない堎合、パッケヌゞはむンストヌルされお䜿甚できる状態であるずは芋なされたせん。 私を信じおはいけたせんか次に、 ./objフォルダヌを砎棄しおから、たずえばVSCodeでプロゞェクトを開き、パッケヌゞの埩元を再実行するように求められるのを確認しおください。どうぞ、詊しおみおください。

パッケヌゞの埩元を実行するプロゞェクトファむルが次のdotnet buildたたはdotnet publishずは異なるディレクトリ構造にある堎合、これらのコマンドはパッケヌゞが埩元されたずは芋なしたせん。

゜リュヌションが完党に倱敗しない理由は、 dotnet publishずdotnet buildの䞡方がdotnet restoreを意味するためです。 埩元されおいないパッケヌゞを積極的にチェックし、オンザフラむで埩元したす。 圌らがこれを行うのを避けるために、あなたは積極的にあなたがしおいない--no-restoreフラグを枡す必芁がありたす。

぀たり、実際には、゜リュヌションが実行しおいるのは、パッケヌゞ_TWICE_を埩元するこずです。 初回は、再利甚するための正しいディレクトリ構造に入らないため、本質的に時間ずスペヌスの倧きな浪費です。 2回目は、 publishコマンドの䞀郚ずしお暗黙的に機胜したす。 ただし、これはビルドず公開の操䜜ず同じレむダヌの䞀郚であるため、コヌドの倉曎ずは別にパッケヌゞが実際にキャッシュされるこずはありたせん。

@rjgotten 、
ご返信ずご説明ありがずうございたす。
実際、すべおのnugetパッケヌゞは、「build」dockerコンテナヌのglobal-packagesフォルダヌにキャッシュされたす。 私の堎合、それは/root/.nuget/packages/フォルダヌであり、 objフォルダヌには、このグロヌバルストレヌゞぞの参照を含む小さなファむルが含たれおいるだけなので、おっしゃるようにストレヌゞを無駄にするこずはありたせん。
すべおのnugetがコンテナにキャッシュされるため、公開䞭の2回目の埩元は少なくずもx10倍速くなりたす私の堎合。

@ zatuliveter @ rjgottenここの最埌にある情報に感謝したす。 私は同様の問題に遭遇し、あなたが䞎えた䟋を改善するために次のdockerfileを思い぀いた。 バッシュは確かに私の匷いスヌツではないので、私に気楜に行っおください 私たちの構造は、すべおのプロゞェクトでProject/Project.csprojです。 これにより、すべおのprojファむルがコピヌされ、正しい堎所に移動されおから、埩元/すべおのコピヌ/公開が実行されたす。

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ./*/*.csproj ./proj/
RUN for file in $(ls ./proj); do mkdir /src/${file%.*} && mv ./proj/${file} /src/${file%.*}/${file}; done
RUN dotnet restore "MyProject/MyProject.csproj"
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet publish "MyProject.csproj" -c Release -o /app --no-restore
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡