Moby: ビルド時間のみ-vオプション

䜜成日 2015幎06月21日  Â·  258コメント  Â·  ゜ヌス: moby/moby

https://github.com/docker/docker/issues/3156の@cpuguy83によっお提案されおいるように
これは、ビルド時の柔軟な-vオプションの䜿甚䟋です。

Dockerむメヌゞを構築するずきは、デヌタベヌスずアプリをむンストヌルする必芁がありたす。 すべおが2぀のtarballにたずめられおいたす。1぀はDB甚で、もう1぀はむンストヌルする必芁のあるアプリスキヌマ、オブゞェクト、静的デヌタ、クレデンシャルなど甚です。 次に、゜リュヌション党䜓が、いく぀かのシェル倉数を凊理し、それに応じおOSクレデンシャルなどを調敎するシェルスクリプトを介しお実行されたす。
䞊蚘のtarballを分解するずたたはDockerfile ADDディレクティブを䜿甚するず、党䜓が最倧玄1.5GBに膚れ䞊がりたす。 あなたが想像できるので理想的ではありたせん。

この'-v/ distrib / ready2installApp/ distrib'ディレクティブを匕き続き可胜にしたい今日のDockerfileにあるように
しかし

宣蚀型ビルドプロセスコヌドずしおのむンフラストラクチャを、コンテナヌの実行時にデプロむ可胜なアヌティファクトから関連付けを解陀したいず思いたす。 必芁のない1.5GBの自重に察凊する必芁はありたせん。

Dockerfileの最埌で実行できる--unmount-volumeオプションを䜿甚できたすか
たた
珟圚DockerfileでVolumeがどのように機胜するかを考えるず、むンストヌル䞭に䜿甚する䞀時ボリュヌム甚の新しいDockerfileディレクティブが必芁になるのではないでしょうか。 @fatherlinuxによっお提䟛されたPuppetの䟋も同様の行にあったず思いたす...
たた
あなたたちが考えるこずができるものは䜕でも。
目的は、デプロむされたアプリたたはサヌビスに圹に立たないすべおの自重を持ち歩く必芁がないようにするこずです。 ただし、その自重は@install-timeに必芁です。 誰もが公匏リポゞトリからの単玔な「yumむンストヌル」を持っおいるわけではありたせん。 :)

どうもありがずうございたす

arebuilder kinfeature

最も参考になるコメント

この機胜の䜿甚䟋は少し異なりたす。ASP.Net5パッケヌゞマネヌゞャヌによっおダりンロヌド/曎新されるパッケヌゞをキャッシュしたす。 パッケヌゞマネヌゞャヌは独自のキャッシュフォルダヌを管理するため、最終的にはビルド間で再利甚できるフォルダヌが必芁になりたす。

すなわち

docker build -v /home/dokku/cache/dnx/packages:/opt/dnx/packages -t "dokku/aspnettest" .

党おのコメント258件

私は同様の解決策を探しおいたす。

問題

最近、私が働いおいる䌁業は、SSL怜査を䜿甚しおZscalerプロキシを有効にしたした。これは、蚌明曞をむンストヌルし、ビルド䞭にいく぀かの環境倉数を蚭定するこずを意味したす。

䞀時的な解決策は、蚌明曞ず環境倉数が蚭定された新しいDockerfileを䜜成するこずでした。 しかし、長期的に芋るず、それは合理的ではないようです。

そのため、最初に考えたのはHTTPずHTTPSを䜿甚した透過プロキシを蚭定するこずでしたが、ビルド䞭に蚌明曞を枡す必芁がありたす。

理想的なシナリオは、同じDockerfileを䜿甚するこずです。ラップトップ、自宅、および䌁業でむメヌゞを構築できたす。

考えられる解決策

# Enterprise
$ docker build -v /etc/ssl:/etc/ssl -t myimage .

# Home
$ docker build -t myimage .

この機胜の䜿甚䟋は少し異なりたす。ASP.Net5パッケヌゞマネヌゞャヌによっおダりンロヌド/曎新されるパッケヌゞをキャッシュしたす。 パッケヌゞマネヌゞャヌは独自のキャッシュフォルダヌを管理するため、最終的にはビルド間で再利甚できるフォルダヌが必芁になりたす。

すなわち

docker build -v /home/dokku/cache/dnx/packages:/opt/dnx/packages -t "dokku/aspnettest" .

@yngndrwは、私にずっおも問題ありたせん。぀たり、コンテナにむンストヌルされおいるため、実行時に必芁のない远加のリ゜ヌスをビルド時にマりントする必芁がありたす。

FWIWこれらのペヌゞのどこかで、誰かが「同様のホストマシンでコンパむルの問題を解決しおから、デプロむ可胜なアヌティファクトたたはexeをコンテナにむンストヌルする」ずいう蚀い換えをしおいるのを芋たした。
私はそれがそれほど単玔な人ではないのではないかず思いたす。 時々、/ usr / binにむンストヌルする必芁がありたすが、いく぀かの構成ファむルも線集する必芁がありたす。 実行しおいるOS、調敎する必芁のあるカヌネルパラメヌタ、倉数たたはマニフェストビルドファむルに応じお䜜成する必芁のあるファむルを確認したす。 コンパむルされた補品の単玔なコピヌでは満足できない倚くの䟝存関係がありたす。

問題を開いたずきに蚀ったこずを蚀い盎したす。マニフェスト宣蚀ファむルずそのプロセス、およびアヌティファクトの実行時間には違いがありたす。
私たちがInfrastructure-as-Code、さらには䞍倉のむンフラストラクチャを本圓に信じおいる堎合、Docker自䜓がさらに掚進しおいお、私はそれが奜きです。これはIMOず真剣に怜蚎する必芁がありたすここの投皿1の肥倧化を参照

ありがずうございたした

本圓に興味深いもう1぀の䜿甚䟋は、゜フトりェアのアップグレヌドです。 FreeIPAの堎合のように、本番デヌタのコピヌを䜿甚しお実際にテストし、さたざたなコンポヌネントがすべお正垞にアップグレヌドできるこずを確認する必芁がある堎合がありたす。 それでも、「ビルド」環境でアップグレヌドを実行する必芁がありたす。 デヌタの本番コピヌを別の堎所に配眮しお、アップグレヌドされた新しいバヌゞョンのコンテナヌを本番環境に移動したずきに、アップグレヌドを行った正確なデヌタをマりンドできるようにする必芁がありたす。

もう1぀の䟋は、スキヌマを頻繁に倉曎し、デヌタベヌスをOracleからバヌゞョン5.6IIRCのPostgresqlに倉曎するSatellite/Spacewalkです。

コンテナ化されたビルドで゜フトりェアのアップグレヌドを行っおいるずきに、特に分散/マむクロサヌビスを䜿甚しお䞀時的にデヌタにアクセスする必芁がある堎合は、非垞に倚くのシナリオがありたす。

基本的に、-vバむンドマりントを䜿甚しお通垞のコンテナヌを実行し、次に「docker commit」を実行するこずにより、手動アップグレヌドを実行する必芁がありたす。 自動化されたDockerfileビルドで同じ機胜が利甚できない理由を理解できたせんか

キャッシュを指摘する@yngndrwの2番目Maven、npm、apt、rpmなどの倚くの䞀般的なプロゞェクトにたったく同じ理由が圓おはたりたす-共有キャッシュを蚱可するず、ビルドが劇的に高速化されたすが、最終的なむメヌゞにするこずはできたせん。

@stevenschlanskerに同意したす。 キャッシュボリュヌムをアタッチするための倚くの芁件、たたはある皮の数ギガバむトのデヌタである可胜性がありたす。これらは、生デヌタずしおではなく、最終むメヌゞに解析された状態で存圚する必芁がありたす。

たた、 docker runで䜿甚できるボリュヌムをサポヌトするために、 docker buildを拡匵するこずぞの䞀貫した抵抗に悩たされおきたした。 再構築するたびにパッケヌゞリポゞトリ党䜓を再ダりンロヌドする必芁がある堎合、Dockerむメヌゞの開発ず反埩がより困難で時間がかかるように芋えるため、「ホストに䟝存しないビルド」のマントラが非垞に説埗力があるずは思いたせんでした。画像。

私の最初のナヌスケヌスは、開発の反埩をスピヌドアップするためにOSパッケヌゞリポゞトリをキャッシュしたいずいうものでした。 私がある皋床成功しお䜿甚しおいる回避策は、 @ fatherlinuxによっお提案されたアプロヌチに䌌おいたす。これは、 docker buildずDockerfileのレスリングを完党に攟棄し、 docker runを䜿甚しお最初から開始するこずです。暙準シェルスクリプトのdocker commitが続きたす。

ちょっずした実隓ずしお、POSIXシェルスクリプトを少し䜿っお、テクニックをdocker buildの本栌的な代替品に拡匵したした dockerize 。

このスクリプトたたは䞀般的なアプロヌチをテストしたい堎合は、それが興味深いか圹立぀かたたは、たったく機胜するかどうかをお知らせください。 䜿甚するには、スクリプトをPATHのどこかに眮き、ビルドスクリプトのシバンずしお远加し #!のもの、Dockerむンストヌルスクリプトの開始を瀺す2番目のシバン行の前に関連する環境倉数を蚭定したす。

FROM 、 RUNDIR 、およびVOLUME倉数は、匕数ずしおdocker runに自動的に枡されたす。
TAG 、 EXPOSE 、およびWORKDIR倉数は、匕数ずしおdocker commitに自動的に枡されたす。

他のすべおの倉数はシェルで評䟡され、環境匕数ずしおdocker runに枡され、ビルドスクリプト内で䜿甚できるようになりたす。

たずえば、このスクリプトはビルド間でAlpine Linuxパッケヌゞをキャッシュしお再利甚したすVOLUMEはホヌムディレクトリをCACHEにマりントし、むンストヌルスクリプトでOSのパッケヌゞリポゞトリキャッシュのシンボリックリンクずしお䜿甚されたす。

#!/usr/bin/env dockerize
FROM=alpine
TAG=${TAG:-wjordan/my-image}
WORKDIR=/var/cache/dockerize
CACHE=/var/cache/docker
EXPOSE=3001
VOLUME="${HOME}/.docker-cache:${CACHE} ${PWD}:${WORKDIR}:ro /tmp"
#!/bin/sh
ln -s ${CACHE}/apk /var/cache/apk
ln -s ${CACHE}/apk /etc/apk/cache
set -e
apk --update add gcc g++ make libc-dev python
[...etc etc build...]

それで、先週MesoConでDockerからフランスの掟遣団に䌚った埌それは喜びの人でした私は圌らが瀟内で同じ問題を抱えおいるこずに気づき、圌らが必芁なものを新しいスリムな画像にコピヌするハックを開発したした。
私は、ハッキングは䌁業の䞖界では歓迎されおいるず思いたす;そしおこの芁求は適切に凊理されるべきです。
聞いおくれおありがずう...

たた、ビルド時にキャッシュディレクトリを共有するこずでビルドを高速化するために、ビルド時の-vフラグを远加するこずに賛成です。

@yngndrw2぀の関連する問題を閉じた理由がわかりたせん。 私はあなたの59号を読みたしたが、これがこれずどのように関連しおいるかわかりたせん。 堎合によっおは、実行時に必芁がないずきにコンテナが肥倧化するこずがありたす。 最初の投皿を読んでください。
ここで䜕かを芋逃しおいないこずを願っおいたす...長い䞀日だったので-o

@zrml問題https://github.com/aspnet/aspnet-docker/issues/59は、すべおのDockerファむルぞのビルド䞭にdockerが提䟛する組み蟌みのレむダヌごずのキャッシュに関連しおいたしたが、この珟圚の問題は、ホストボリュヌムを䜿甚しお、ボリュヌムを特別に䜿甚するdockerfileに䟝存するdockerfile固有のキャッシュを提䟛するこずに぀いお話し合っおいたす。 問題https://github.com/aspnet/aspnet-docker/issues/59は、特にaspnet-dockerプロゞェクト/リポゞトリに関連しおいないため、閉じたした。

あなたが蚀及しおいるず思うもう1぀の問題は、 https//github.com/progrium/dokku/issues/1231の問題です。これは、組み蟌みのDockerレむダヌキャッシングを明瀺的に無効にするDokkuプロセスに関するものでした。 Michaelは、この動䜜を構成できるようにするためにDokkuに倉曎を加えたした。これにより、Dokkuプロゞェクト/リポゞトリに関する問題が解決され、問題も解決されたした。

未解決のDocker関連の問題がただ存圚する可胜性がありたす぀たり、Dockerが問題https://github.com/aspnet/aspnet-docker/issues/59で期埅したように組み蟌みのレむダヌキャッシングを凊理しなかったのはなぜですか。それがなぜであるかを解明し、それがただ起こっおいるかどうかを確認する機䌚がありたせんでした。 それでも問題が解決しない堎合は、この珟圚の問題ずは異なるため、このプロゞェクト/リポゞトリの新しい問題を提起する必芁がありたす。

@yngndrwは正確に、これは異なり、@ docker.comずしお知られおいるこずに同意するので、よろしければ再開したす...たあ、できたせん。 よろしいですか
少なくずもSFを閉じる前に、SFの同僚からのコメントをいく぀か芋たいです。

ずころで、私は@ cpuguy83から、ナヌザヌケヌスを開いお、ログ3156からすべおを説明するように求められたした。

@zrmlフォロヌするかどうかわかりたせん-再床開きたいのはhttps://github.com/aspnet/aspnet-docker/issues/59ですか これは/aspnet/ aspnet-dockerの問題ではないため、その問題を再床開くのは適切ではないず思いたす。 これは実際には/docker/ dockerの新しい問題であるはずですが、怜蚌する必芁があり、最初に生成される再珟可胜な手順が必芁になりたす。

いや、いや、昚日閉店したこれ14080。

この問題はただ開いおいたすか

@yngndrw赀い「閉じた」アむコンを読み間違えたず思いたす。 謝眪。

ビルド時間-vが倧きな助けになるこずに心から同意したす。

ビルドキャッシングは1぀のナヌスケヌスです。

もう1぀のナヌスケヌスは、ビルド時にsshキヌを䜿甚しお、レむダヌに保存せずにプラむベヌトリポゞトリからビルドするこずです。これにより、 https //github.com/dockito/vaultのようなハッキングの必芁がなくなりたす。

これは䌁業の䞖界では地獄なので、ここでコメントしたす。
SSLむンタヌセプトプロキシがありたすが、トラフィックを転送するこずはできたすが、プロゞェクトのヒヌプは、SSL接続が良奜であるず想定しおいるため、ひどく死んでしたいたす。

私のマシンしたがっおDocker Builderはプロキシを信頌しおいたすが、Dockerむメヌゞは信頌しおいたせん。
さらに最悪のベストプラクティスは、コンテナヌ内でcurlを䜿甚するこずです。これは面倒なので、Dockerfileを倉曎しおビルドする必芁がありたす。 -vオプションを䜿甚しお蚌明曞をマりントでき、満足しおいたす。

これは蚀われおいたす。 Dockerのせいではなく、apt-getの動䜜ず同様のシステムを䜿甚する必芁があるずきにhttpsを䜿甚するパッケヌゞマネヌゞャヌのせいです。 それでも安党で怜蚌可胜であり、httpプロキシによっおキャッシュするこずもできたす。

@btreppは、別の良いナヌスケヌスをありがずうございたす。

別の状況が考えられたす。

dockerfilesでやりたいこずの1぀は、「コンパむルされた」dockerfileを䜿甚しおビルドツヌルを出荷しないこずです。 Cアプリがgccを必芁ずする理由も、rubyアプリがむメヌゞ内のバンドラヌを必芁ずする理由もありたせんが、珟圚Dockerビルドを䜿甚しおいたす。

私が持っおいたアむデアは、dockerfileを指定するこずです。これは、内郚でビルドするずきに耇数のdockerコマンドを実行したす。 以䞋の疑䌌っぜいdockerfiles。

他を構築するDockerファむル

FROM dockerbuilder
RUN docker build -t docker/builder myapp/builder/Dockerfile
RUN docker run -v /app:/app builder
RUN docker build -t btrepp/myapplication myapp/Dockerfile

btrepp / myapplication dockerfile

FROM debian:jessie+sayrubyruntime
ADD . /app //(this is code thats been build using the builder dockerfile
ENTRYPOINT ["rails s"]

ここに、すべおのバンドルむンストヌル/パッケヌゞ管理ずビルドスクリプトを実行する䞀時コンテナヌがありたすが、ランタむムコンテナヌが必芁ずするファむルを生成したす。

ランタむムコンテナは、この結果を远加するだけです。぀たり、rubyをむンストヌルするだけで枈みたす。 たずえばGCCたたは静的にリンクされたgoの堎合、実行するのにコアOSファむル以倖のものは必芁ないかもしれたせん。

これにより、Dockerむメヌゞが超軜量に保たれたす。

ここでの問題は、䞀時的なビルダヌコンテナが最埌になくなるこずです。぀たり、ある皮のキャッシュをロヌドする機胜がないず非垞に高䟡になり、 debianjessieを䜕床も取埗するこずになりたす。

このような特定の手法を䜿甚しおいる人を芋おきたしたが、倖郚httpサヌバヌを䜿甚しおビルドファむルを远加しおいたす。 すべおをdockerでビルドし続けたいず思いたす。 Dockerむメヌゞを䜿甚しおこれを適切に行う方法はおそらくありたすが。 runを䜿甚しお、ボリュヌムをマりントできるようにしたす。

別の䟋を瀺したす。 カヌネルのすべおのデバッグシンボルYuuuugeを含むsystemtapのコンテナヌを䜜成するずしたす。 基盀ずなる/lib/ modulesをマりントしお、yumコマンドがむンストヌルするRPMを認識できるようにする必芁がありたす。

さらに、1.5GBのむメヌゞデバッグシンボルから以倖の堎所にこれらをラむブで配眮したいのかもしれたせん

Dockerfileを曞きに行ったずころ、䞍可胜だず気づきたした:-(

docker run --privileged -v /lib/modules:/lib/modules --tty=true --interactive=true rhel7/rhel-tools /bin/bash
yum --enablerepo=rhel-7-server-debug-rpms install kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r)
docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                        PORTS               NAMES
52dac30dc495        rhel7/rhel-tools:latest   "/bin/bash"         34 minutes ago      Exited (0) 15 minutes ago                         dreamy_thompson
docker commit dreamy_thompson stap:latest

https://access.redhat.com/solutions/1420883

他の理由でバグがクロヌズされたので、ここで3949からナヌスケヌスを繰り返したいず思いたす。

Dockerでプロプラむ゚タリ゜フトりェアをサンドボックス化したいのですが。 どこにでもホストするこずは違法であり、ダりンロヌドプロセスを珟実的にたたは合法的に自動化するこずはできたせん。 合蚈するず、むンストヌラヌは玄22GBになりたすリリヌスごずに倧きくなりたす。 これをビルド時にDockerむメヌゞにコピヌする必芁があるず期埅するのはばかげおいるず思いたす。

この必芁な機胜に関するニュヌスはありたすか
ありがずうございたす

_USER POLL_

_このディスカッションに倉曎があった堎合に通知を受け取る最良の方法は、右䞊の[賌読]ボタンをクリックするこずです。_

以䞋にリストされおいる人々は、ランダムな+1であなたの有意矩な議論に感謝しおいたす。

@vad

この機胜の+1

もう1぀のナヌスケヌスは、ビルド時にsshキヌを䜿甚しお、レむダヌに保存せずにプラむベヌトリポゞトリからビルドするこずです。これにより、 https //github.com/dockito/vaultのようなハッキングの必芁がなくなりたす。

これは私たちのナヌスケヌスでもありたすこの堎合、ホストでtmpfsを䜿甚しおレンダリングされたsshキヌ。

これのもう1぀の䜿甚䟋は、ビルド時間を短瞮するためのCIサヌバヌ䞊のnode_modulesディレクトリのロヌカルキャッシュです。
npm installは非垞に遅く、 package.jsonが画像にADDされおいる珟圚の「最良の」ケヌスでも、 npm installが実行されおからpackage.jsonぞの倉曎に基づいお远加および構築された実際のプロゞェクト゜ヌスは、すべおの䟝存関係を再床ダりンロヌドする必芁がありたす。

ノヌド/npm偎でのこれに関する問題に぀いおは、npm / npm8836を参照しおください。

パッケヌゞの埩元が遅いこずず、レむダヌに珟圚のパッケヌゞをキャッシュした結果のむメヌゞサむズに関する、関連するaspnet-dockerの問題。 パッケヌゞのキャッシュには、マりントされたボリュヌムを䜿甚する方がはるかに優れおいたす。
https://github.com/aspnet/aspnet-docker/issues/123

これは蚀語固有の問題ではありたせん。パッケヌゞマネヌゞャヌが珟圚受け入れられおいる暙準であるこずを考えるず、倚くの人に圱響がありたす。

OPは、「docker build -v」がビルドプロセスをランタむム環境から切り離すのに倧いに圹立぀ずいう点で、問題を頭に抱えおいたす。

「マルベリヌハヌバヌ」を構築するいく぀かのプロゞェクトを芋おきたした。これらのプロゞェクトは、実際のDockerを構築するために䜿甚され、プッシュ/配垃されたす。 これは、管理ずコンピュヌティングリ゜ヌスの䞡方の芳点から非垞に耇雑であり、CIず単䜓テストが遅くなり、党䜓的に生産性の䜎い開発ワヌクフロヌになりたす。

私はこれに぀いお考えおきたした、そしお私が考えるこずができる他のオプションは「src」レむダヌずしおレむダヌをマヌクする機胜です。

これらのレむダヌの線に沿ったものは、Dockerのビルド䞭にのみアクセス可胜ですが、結果のむメヌゞファむルにはプルされたせん。

このようにしお、Dockerは以前のレむダヌ/むメヌゞ、䞀時的なビルドアヌティファクトをキャッシュできたすが、最終的なむメヌゞを利甚するためにこれらは必芁ありたせん。

䟋えば。

FROM ubuntu
RUN apt-get install gcc
ADDPRIVATE . /tmp/src <--these can be cached by docker locally
RUNPRIVATE make     <-- basically these layers become scoped to the current build process/dockerfile
RUN make install <--result of this layer is required.

もちろん、これは、重芁なファむルを陀倖するこずができるため、自分が䜕を䞊手く行っおいるかを知る必芁があるこずを意味したす。

@yngndrw
ネットコアのような状況でのはるかに優れた゜リュヌションは、パッケヌゞ管理にHTTPSを䜿甚しないこずです。その埌、Dockerビルド甚の透過的なキャッシングプロキシを持぀ようにiptables + squidを蚭定するのは簡単です。私の個人的な意芋では、これらのパッケヌゞマネヌゞャヌはゲヌムでは、sslが蟞任するため、䌁業環境での䜿甚はひどいものですが、apt-getなどは完党に正垞に機胜し、Docker甚のiptables+squidで既にキャッシュ可胜です。

たた、ビルド時間ボリュヌムを䜿甚するこずの欠点もわかりたす。dockerfileは再珟性が䜎く、docker build -t btrepp / myappの倖郚で远加のセットアップが必芁になりたす。たた、dockerhubでの自動ビルドが困難になりたす。

@btrepp 私はあなたの提案が奜きです。 Dockerが教えおくれるハヌドコヌドされたTMPディレクトリを䜿甚しおナヌスケヌスを生きるこずもできたす。これにより、すべおのレむダヌから最終的なアヌティファクトを構築するずきに、1぀を忘れたり陀倖したりできるようになりたす。 /this_is_the_tmp_explosion_folder_that_will_be_removed_from_your_final_container_imageにマりントされおいたす
簡単です...

@btrepp私はあなたの゜ヌスレむダヌのアむデアがずおも奜きです。

ただし、SSLを䜿甚しないパッケヌゞマネヌゞャヌに関しおは、同意しない必芁がありたす。

そのようなパッケヌゞをキャッシュしたい堎合は、公匏゜ヌスを反映したロヌカルプラむベヌトパッケヌゞフィヌドを代わりに䜿甚する必芁がありたす。 HTTPに戻すこずは私には悪い考えのように思えたす。特に、倚くのパッケヌゞマネヌゞャヌがパッケヌゞに眲名しおいないようであり、したがっおHTTPSに䟝存しおいるこずを考えるず。

この問題がただ修正されおいないずきに䜿甚できるツヌルgrammarly/rockerがありたす。

@yngndrw

ロヌカルプロキシなどである私のポむントは、長い間解決されおきた問題です。 パッケヌゞマネヌゞャヌは怜蚌のみが必芁であり、プラむバシヌは必芁ありたせん。 httpsを䜿甚するこずは怜蚌を提䟛する怠惰な方法ですが、プラむバシヌの添付ファむルが付属しおいたす。

httpsを介しおプルダりンされるずきに、「super_awesome_ruby_lib」をプラむベヌトにする必芁がある理由はありたせん。 より良い方法は、ルビヌの宝石にキヌリングを付けるこずです。 たたは、既知の公開鍵でさえ、パッケヌゞに眲名するためのものです。 これは倚かれ少なかれapt-getの仕組みであり、暙準のhttpプロキシが物事をキャッシュできるようにしたす。

ロヌカルのプラむベヌトパッケヌゞフィヌドに関しおは、dockerはこれ自䜓もサポヌトしおいたせん。 暙準フィヌドを無効にする方法はありたせん。https蚌明曞が蚌明曞ストアにない堎合は、_正しく_倱われたす。 Dockerは、画像をプルするずきに、少なくずもメむンフィヌドを垞にチェックしたいず思っおいるず確信しおいたす。 Afaik the rocket / rktの実装では、signing+httpを䜿甚しおコンテナむメヌゞを取埗しおいたした。

ビルド時間ボリュヌムの䞻な動機がパッケヌゞのキャッシュだけである堎合、珟圚のDockerの自動化/玔粋性の䞀郚を損なうのではなく、キャッシュをより適切にサポヌトするようにパッケヌゞマネヌゞャヌに圧力をかける必芁があるず思いたす。

明確にするために、私はパッケヌゞマネヌゞャヌがhttpを䜿甚しおhttpsを削陀するだけに切り替えるこずを掚奚しおいたせん。 䞭間者攻撃を防ぐために、パッケヌゞの怜蚌が必芁です。 圌らが必芁ずしないのは、httpsを「セキュリティがすべおのスレッゞハンマヌを捕たえる」提䟛ずしお䜿甚するプラむバシヌの偎面です。

それは本圓に狭い芖野です。 あなたは、パッケヌゞマネヌゞャヌの䞖界党䜓に、アプリケヌションが構築されるず圌らが考える方法に関するDockerの芏定に合うように圌らがどのように振る舞うかを倉曎するように求めおいたす。

このスレッドでこれが必芁な理由の䟋は他にもたくさんありたす。 「アプリケヌションの構築に䜿甚するすべおのツヌルの動䜜を倉曎するだけでよい」ず蚀っおも、問題は解決されたせん。ナヌザヌを回避するだけです。

Dockerのパブリックレゞストリぞのアタッチメントにも匷く同意したせん。パブリックレゞストリぞのアクセスを犁止し、内郚レゞストリのみを䜿甚できるようにするこずを匷く望んでいたす。しかし、それはたったく別のテヌマです。

私にずっおはdocker build -vも必芁です。

この䟋では、関連する補品の事前構成されたむンストヌルで構成されるむメヌゞを構築する必芁があり、むンストヌラヌは2GBを超えおいたす。 ホストボリュヌムをマりントできないため、ホストOSに既にダりンロヌドしおいるにもかかわらず、むンストヌラヌでむメヌゞをビルドできたせん。ホストOSには、さたざたなツヌル/プロトコル、たずえばhttps cert/authを䜿甚したプロキシを䜿甚できたす。 、たたは倚分少し急流。

回避策ずしお、 docker buildの間にwgetを䜿甚しおむンストヌラヌを再ダりンロヌドする必芁がありたす。これは、非垞に制限された環境であり、利䟿性がはるかに䜎く、時間がかかり、゚ラヌが発生しやすくなりたす。

たた、補品のむンストヌル/構成オプションの柔軟性により、単にむンストヌラヌでむメヌゞを出荷するよりも、補品がプレむンストヌルされた状態でむメヌゞを出荷する方がはるかに理にかなっおいたす。

@thaJeztahこれが起こる可胜性はありたすか

これが、Dockerを䜿甚しないたたは実際には䜿甚できない唯䞀の理由です。

-vオプションを含むDockerのRedHatバヌゞョンでパッチを提䟛しおいたす。 しかし、これに察する真の解決策は、Dockerビルド以倖のOCIコンテナむメヌゞをビルドするための新しいさたざたな方法を構築するこずです。

@rhatdan RHELたたはFedora

たた、resin.ioの内郚バヌゞョンのdockerにdockerbuildの-vオプションを実装したした。 ここで差分を芋぀けるこずができたすhttps://github.com/resin-io/docker/commit/9d155107b06c7f96a8951cbbc18287eeab8f60cc

@rhatdan @petrosaggこのためのPRを䜜成できたすか

@jeremyherbertパッチは、RHEL、CentOS、およびFedoraの最近のすべおのバヌゞョンに付属するdockerデヌモンに含たれおいたす...

@graingert過去に提出したしたが、华䞋されたした。

@rhatdanあなたはそれにリンクがありたすか

@runco​​mリンクはありたすか

@thaJeztahこれはあなたたちが拒吊したであろうものですか

クロヌズされた、たたは察応されおいない既存の問題のリストは次のずおりです。
https://github.com/docker/docker/issues/3949
https://github.com/docker/docker/issues/3156
https://github.com/docker/docker/issues/14251
https://github.com/docker/docker/issues/18603

RHEL / CentOS /Fedoraで䜿甚されるProjectAtomicパッチに関する情報は、次の堎所にありたす。
http://www.projectatomic.io/blog/2016/08/docker-patches/

@daveisferaは、RWボリュヌムではなくRボリュヌムのみを远加するように芋えるため、 @yngndrwず私のナヌスケヌスでは機胜したせん。

@graingertなぜRWボリュヌムが必芁なのですか 特定の堎合の回避策ずしお、読み取り専甚を理解しおいたす。

スキヌマの移行をテストするこずは、1぀の正圓な理由です...

2016幎11月1日午前10時36分、ブラむアンゎフは次のように曞いおいたす。

@graingert https://github.com/graingertなぜRWボリュヌムが必芁なのですか
特定の堎合の回避策ずしお、読み取り専甚を理解しおいたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/docker/docker/issues/14080#issuecomment -257582035、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAHLZdp0D6fAtuNglajPBIwnpWGq3slOks5q5050gaJpZM4FIdOc。

スコットマッカヌティ

スコット。 [email protected]

http://crunchtools.com

@fatherlinux

@cpuguy83RWのもう1぀のナヌスケヌスはccacheです

@fatherlinuxフォロヌするかどうかわかりたせん。 なぜこれにボリュヌムが必芁なのですか たた、なぜビルドフェヌズで実行する必芁があるのですか

この機胜の䜿甚䟋は少し異なりたす。ASP.Net5パッケヌゞマネヌゞャヌによっおダりンロヌド/曎新されるパッケヌゞをキャッシュしたす。 パッケヌゞマネヌゞャヌは独自のキャッシュフォルダヌを管理するため、最終的にはビルド間で再利甚できるフォルダヌが必芁になりたす。

たずえば、マりントをバむンドしたす。

docker build -v /home/jenkins/pythonapp/cache/pip:/root/.cache/pip  -t pythonapp .
docker build -v /home/jenkins/scalaapp/cache/ivy2:/root/.ivy2  -t scalaapp .

スキヌマの移行は、次の堎合に実行する必芁があるこずが倚いためです。
゜フトりェアがむンストヌルされたす。 読み取り専甚コンテナを実行する堎合は、
にいるずき以倖は゜フトりェアをむンストヌルしないでください
ビルドフェヌズ....。

2016幎11月1日午前10時42分、ブラむアンゎフは次のように曞いおいたす。

@fatherlinuxhttps ://github.com/fatherlinuxフォロヌするかどうかわかりたせん。
なぜこれにボリュヌムが必芁なのですか たた、なぜそれが䞭に行われなければならないのですか
ビルドフェヌズ

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/docker/docker/issues/14080#issuecomment -257583693、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAHLZfhBG8RUWtqPD-6RaLC7uoCNc-3nks5q50_TgaJpZM4FIdOc。

スコットマッカヌティ

スコット。 [email protected]

http://crunchtools.com

@fatherlinux

このディレクトリの内容によっおビルドがホストに䟝存するこずはないこずを私は知っおいたすこれらのマりントがないず、ビルドはずにかく動䜜したすが、遅くなりたす

NFSは30幎前のようにこれを解決したした...

2016幎11月1日午前10時45分、トヌマス・グレむンゞャヌは次のように曞いおいたす。

このディレクトリの内容がビルドを停止しないこずを私は知っおいたす
べき等たたはホストに䟝存しおいるこれらのマりントが欠萜しおいるず、
ずにかく動䜜するビルド

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/docker/docker/issues/14080#issuecomment -257584576、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAHLZS75Vq0BSEvUjI2oXORsS0el2mwOks5q51CQgaJpZM4FIdOc。

スコットマッカヌティ

スコット。 [email protected]

http://crunchtools.com

@fatherlinux

NFSは30幎前のようにこれを解決したした...

圹に立たないコメント

@graingert申し蚳ありたせんが、それは深刻に間違っおいたした。 私はあたりにも迅速に察応しようずしおいお、十分なコンテキストを提䟛しおいたせんでした。 真剣に、私たちはこれらのタむプの問題のいく぀かを解決するためにCRIOず組み合わせたNFSを怜蚎しおいたす。

むメヌゞレゞストリずbuldの䞡方に、倚くの共通点がありたす。 あなたが話しおいるのは基本的にキャッシングの問題です。 NFS、特に組み蟌みのキャッシングにより、ビルドをホストに䟝存せず、すべおのキャッシングを凊理できたす。

したがっお、-vビルド時間オプションを䜿甚しおも、ビルドを1぀のホストのみにロックする必芁はありたせん。 むンタヌネットの芏暡に䟝存しない堎合もありたすが、ビルド環境を単䞀のサむトたたは堎所に制埡する倚くの人にずっおは十分です。

@fatherlinux gitlabたたはtravisキャッシングを䜿甚しお、キャッシュディレクトリを取埗し、S3にアップロヌド/ダりンロヌドしたす。

@graingertええ、しかしそれは特定のタむプのデヌタ/アプリでのみ機胜し、たたバケットレベルでのみ機胜し、posixメタデヌタずブロックレベルでは機胜したせん。 certianタむプのフロント゚ンドおよびミドルりェアアプリの堎合、問題ありたせん。 デヌタベヌススキヌマの移行では、事前にテストを行い、速床を䞊げるためにキャッシュをロヌカルにする必芁がありたす。通垞、キャッシュはposixである必芁がありたす。

1TBのデヌタを含むMySQLGaleraクラスタヌがあり、アップグレヌドを実行したいずしたす。これらはすべおコンテナヌ内にありたす。 コンテナ化/オヌケストレヌションされたマルチノヌド、シャヌディングされたガレラは本圓に䟿利です。 アップグレヌドのたびにスキヌマの移行を手動でテストする必芁はありたせん。

デヌタボリュヌムKube Worldではpvのスナップショットを䜜成し、ビルドサヌバヌに公開しおから、アップグレヌドずスキヌマの移行をテストしたす。 すべおが正垞に機胜し、テストに合栌した堎合は、本番コンテナを構築し、本番環境でスキヌマの移行を実行したす。

@graingert申し蚳ありたせんが、远加するのを忘れお、テスト実行で䜿甚されたスナップショットを砎棄したす...ビルドむベントずテストむベントを別々にオヌケストレヌションしたくありたせんが、それは可胜です...

@fatherlinuxこれは盎亀するナヌスケヌスだず思いたす...

@graingertは有甚なコメントではありたせん。 䜕に盎亀したすか ビルド䞭の-vの芁求に盎亀したす。これは、この䌚話の内容であるず私が理解したものですか

このフラグにはいく぀かの異なる甚途がありたす。

  • キャッシュ、Dockerビルドサヌバヌ間で共有
  • 単䞀のDockerfileの「ビルド䞭」にのみ適甚されるADDのようなキヌワヌド。 たずえば、巚倧なファむルを远加しおから、画像から陀倖したす。
  • すべおの出力を無芖するADD+RUNのようなキヌワヌド。 たずえば、巚倧なファむルを远加しおから、ステップを実行し、画像ぞの倉曎を無芖したす。1぀のステップでADD + RUNを実行しおから、レむダヌをスキップしたす。

埌の2぀のナヌスケヌスは、2぀の新しいキヌワヌドを䜿甚しおより明確に解決できたす。

BUILDCONSTFILE <path>

各実行の前にCOPY <path>を実行し、実行埌に<path>をむメヌゞから削陀したす。

TEST <cmd> WITH <paths>

パスをコピヌしおコマンドを実行し、終了ステヌタスが0の堎合、芪むメヌゞからビルドを続行したす。それ以倖の堎合は、ビルドを停止したす。

個人的には、TEST ... WITHは、コンテナヌ党䜓をテストする別のCIステップでより適切に凊理されるず思いたす。

はじめに私はビルドに--mountを远加しおも倧䞈倫だず_思いたす_ "-v"はおそらくそれほど倚くはありたせん。 実装、キャッシングがどのように凊理されるかたたは凊理されないかなどに぀いお100確実ではありたせん。

Dockerプロゞェクトの堎合、ビルダヌむメヌゞをビルドしたす。
基本的に必芁なものはすべお揃っおおり、コヌドをコピヌしたすが、実際にはDockerをビルドしたせん。
これを調敎するMakefileがありたす。 したがっお、 make buildはむメヌゞをビルドし、 make binaryは䟝存関係ずしおbuildを䜿甚しおバむナリをビルドしたす。

バむナリを䜜成するず、ビルドむメヌゞが実行され、ビルドが実行されたす。これにより、むンクリメンタルビルドのパッケヌゞキャッシュなど、必芁なものにマりントできたす。
これのほずんどは非垞に単玔で、簡単に調敎できたす。
したがっお、今日このケヌスを凊理する方法は確かにありたす。Dockerだけでは100凊理できずこれは必ずしも悪いこずではありたせん、CIシステムでこれを機胜させる必芁がありたす。

@cpuguy83これは私のナヌスケヌスのほずんどを釘付けにするだろうず思いたす。 私が理解しおいるように、--mountは読み取り専甚を意味したすか および-vを読み取り/曞き蟌みしたすか

@ cpuguy83たた、私たちは䞻に、IMHOがたすたす䞀般的なパタヌンになり぀぀ある「ビルダヌ」むメヌゞを構築しおいたす...

@fatherlinux swarm servicesおよび珟圚1.13の堎合 docker runは、はるかに正確で柔軟な--mountをサポヌトしおいたす https //docs.docker.com/engine/reference/commandline/service_create/#

ドキュメントに3番目のタむプのマりントtmpfsがないようです。

ああ、ずおもかっこいい、ありがずう...

2016幎11月1日午埌2時20分、ブラむアンゎフは次のように曞いおいたす。

@fatherlinux https://github.com/fatherlinux swarm services and now
1.13の堎合| docker run | |--mount|をサポヌトしたすこれははるかに正確です
柔軟
https://docs.docker.com/engine/reference/commandline/service_create/#/add -bind-mounts-or-volumes

ドキュメントに3番目のタむプのマりント|tmpfs|がないようです。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/docker/docker/issues/14080#issuecomment -257648598、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAHLZXv_VBfVi4WUAjVijE-SKR0ErRC4ks5q54L2gaJpZM4FIdOc。

スコットマッカヌティ

スコット。 [email protected]

http://crunchtools.com

@fatherlinux

@ cpuguy83ビルダヌパタヌンも頻繁に䜿甚しおおり、画像に保持されず、レむダヌの無効化にも耐えられるキャッシュが必芁です。

Yoctoむメヌゞを構築し、NFSストレヌゞに共有sstateキャッシュがありたす。 もう1぀のナヌスケヌスはnpmキャッシュです。これにより、 RUN npm installレむダヌ党䜓を無効にできたすが、パッケヌゞがキャッシュされるため、より高速に再蚈算できたす。

@graingertの投皿に基づく考えられる劥協案ずしお、dockerfileに巚倧なファむルのオプションのハッシュを含めるこずができず、dockerはビルドの実行時にこれをチェックしたすか その堎合、決定論的ビルドに問題はなく、ある時点で奇劙な゚ラヌで爆発するのではなく、ビルドする人にずっお必芁な䟝存関係がないこずは明らかです。 ずにかくdockerfileず䞀緒に配垃する必芁があるsshキヌなどにも同じこずが蚀えたす。

たた、巚倧なファむルの_コピヌ_を必芁ずするアむデアは理想的ではないず思いたす。 私が䜿甚したいファむルサむズは10〜40 GBのオヌダヌであり、優れたssdを䜿甚しおも、少なくずも1〜2分はコピヌする䟡倀がありたす。 これは、DockerにすでにあるADDディレクティブに関する私の問題です。 むメヌゞがビルドされるたびに30GBを远加したくないので、䜙分な空き領域をすべお確保し、むメヌゞを朰す必芁がありたす。

これを䜿甚しおいる目的では機胜したせん。 キャッシュミスはビルド䞭に蚈算され、将来のためにsstateに保存されるため、ビルドでバむンドマりントされたRWであるyoctoビルドシステムからのsstateキャッシュを含むボリュヌムがありたす。 私たちのディレクトリも玄30GBなので、ハッシュの蚈算でさえ時間がかかりたす。

決定論的なビルドの抂念を理解したこずはありたせん。 今日のセマンティクスでも、自分の足を撃぀方法がありたす。 たずえば、内郚IPからcurl䜕かを取埗できたす。 突然、このDockerfileはどこでも機胜しなくなり、ホストに䟝存したす。 しかし、なぜあなたがそれをしたいのかずいう正圓なケヌスがありたす。 たずえば、ロヌカルHTTPキャッシュ。

ビルドはずにかく決定論的ではなく、今日のネットワヌク䞊でバむンドマりントされたボリュヌムを゚ミュレヌトできるので、必芁に応じお適切な譊告を衚瀺するネむティブな方法を提䟛しおみたせんか

@petrosagg @zrml @thaJeztah私たちが知っおいるこずは

  • 71153156を調べおみるず、この同じ問題に぀いお議論しおいる䜕幎も前の問題の長いリストを芋぀けるこずができたす
  • ほずんどは再珟性の理由でクロヌズされたしたたたは叀いDockerfile syntax is frozenコメント、そしおHEALTHCHECK呜什が远加された埌、フリヌズは削陀されたしたが、問題はクロヌズされたたたでした
  • この問題により、倚くのチヌムが長幎にわたっお日垞の開発でコンテナの䜿いやすさや生産性を向䞊させるこずができなくなりたした。 @btreppが蚀ったように、これは地獄です
  • Dockerの人々はこの問題に気づいおいたすが、これは私のdockerビルドが壊れたクラスをもたらすでしょう 共有キャッシュが良くないために問題が発生する
  • しかし、ディスクキャッシュからネットワヌクキャッシュに移行しおも、ビルドの信頌性は向䞊しないようで、httpを介した栄光のキャッシュずしお機胜し、事態を悪化させるこずがわかっおいたすビルドごずにむンタヌネットをダりンロヌドする、HTTPS、ファむルのサむズ、コンテナのビルド時のディスクスラッシング、レむダヌキャッシング、耇雑なビルドオヌケストレヌションなど

私たちが知っおいるこずをすべお考えるず、これはDupeたたはWontFixのいずれかずしおクロヌズされる可胜性が高いず思いたす。 私たちがどのようなナヌスケヌスを提䟛するかは問題ではないようです。 曎新ここで間違っおいるこずを嬉しく思いたす。 提案はオヌプンに芋えたす:)

圓瀟は䞍可知論的なコンテナランタむムに移行し、たもなく䞍可知論的なむメヌゞ構築゚クスペリ゚ンスにも移行する必芁がありたす。 しかし、吊定性は圹に立たないので、これはそれを議論するのに適切な堎所ではありたせん。 それは別の投皿である必芁がありたす。

@rdsubhasは、完了したらリンクを共有するこずに気を配っおいたすか

@rdsubhasそれは玠晎らしい芁玄です。 @ cpuguy83は、ほずんどのナヌスケヌスをカバヌするビルド䞭に--mountを远加しおも問題ないず考えおいるため、このスレッドはdupe/wontfixずしお閉じられるようには芋えたせん。

私が知りたいのは、珟圚の提案が䞎えられおいるこずです

  1. Dockerfile構文を倉曎したせん
  2. ビルドを珟圚よりもホストに䟝存させるこずはありたせん

アむデアに関しお残された反論はどれですか ない堎合は、 --mountメカニズムの実装の詳现に぀いお話し合う必芁がありたす。

ビルドはすでにホストに䟝存しおおり、再珟できないずいう議論を匷化するために、このプロパティを持぀Dockerfileフラグメントのリストを提䟛したす。

# Install different software depending on the kernel version of the host
RUN wget http://example.com/$(uname -r)/some_resource
# example.intranet is only accessible from specific hosts
RUN wget http://example.intranet/some_resource
# get something from localhost
RUN wget http://localhost/some_resource
# gcc will enable optimizations supported by the host's CPU
RUN gcc -march=native .....
# node:latest changes as time goes by
FROM node
# ubuntu package lists change as time goes by
RUN apt-get update
# install different software depending on the docker storage driver
RUN if [ $(mount | head -n 1 | awk '{print $5}') == "zfs" ]; then .....; fi

正盎なずころ、 --mountを远加しお、ナヌザヌにキャッシュの無効化 --no-cache を凊理させるだけで、問題はないず思いたす。 CLIからのよりきめ现かいキャッシュ制埡を、すべおたたは䜕もないよりも芋たいず思うかもしれたせんが、それは別のトピックです。

私のナヌスケヌス

私はしばらくの間同様の問題に盎面しおいたすが、解決策が完成するたで画像のサむズを倧きくするこずを遞択したした。 誰かがより良い回避策を芋぀けた堎合に備えお、ここで私のシナリオを説明しようず思いたす。

条件

  1. CircleCIには、ビルド䞭にすべおの内郚䟝存関係をダりンロヌドするためのsshキヌがありたす
  2. GitHubは内郚䟝存関係をホストし、その他はビルド䞭にむメヌゞ内からダりンロヌドできたす

オプション

  1. --build-argを䜿甚しお、ビルド䞭にトヌクンを枡したす匷くお勧めしたせん。 これは、远加の手順なしで「機胜する」ため、非垞に魅力的で簡単なオプションです。
  2. すべおの䟝存関係をダりンロヌドしお、ビルドコンテキストに远加したす。 残念ながら、 ADDずCOPYは別々のレむダヌで実行されるため、前のレむダヌのデヌタで行き詰たりたす。

䞀郚の画像のサむズが2倍以䞊になる堎合もありたすが、珟時点では党䜓のサむズは蚱容範囲内です。 ビルド履歎からビルド時間匕数を削陀するPR私はそれを芋぀けるこずができないようですがあったず思いたすが、キャッシュの懞念irrcのために受け入れられたせんでした。
他の回避策が䜿甚されおいるず聞いおうれしいです。

@misakwa1.14のビルドでシヌクレットをサポヌトする可胜性がありたす。

@cpuguy83を聞いおずおも゚キサむティングです。 発売時期に泚目したす。 それは間違いなく私のワヌクフロヌのいく぀かを単玔化するでしょう。

1.14でのビルドでシヌクレットをサポヌトする可胜性がありたす。

yarn-cacheなどの他のタむプのボリュヌムのビルド時マッピングのマッピングにも機胜したすか

ずころで、docker-composeを䜿甚しおプロダクションむメヌゞを構築する興味深い方法がありたす。私はそれが機胜し、非垞に効果的であるこずがわかりたした。

したがっお、次のようなファむルdocker-compose.build.ymlを䜜成したす。

services: 
  my-app:
    image: mhart/alpine-node:7.1.0
    container_name: my-app-build-container # to have fixed name
    volumes:
    - ${YARN_CACHE}:/root/.cache/yarn # attach yarn cache from host
    - ${HOME}/.ssh:/.ssh:ro    # attach secrets
    - ./:/source
    environment: # set any vars you need
     TEST_VAR: "some value"    
    ports:
    - "3000"
    working_dir: /app/my-app # set needed correct working dir even if if doesn't exist in container while build type
    command: sh /source/my-app.docker.build.sh # build script

1dockercomposeを䜿甚しおコンテナヌを構築したす。

$ docker-compose -f docker-compose.build.yml up --force-recreate my-app

コンテナを䜜成し、シェルビルドスクリプトmy-app.docker.build.shを実行したす。私は、 Dockerfileを䜿甚せず、ビルドスクリプトですべおを実行したす。

  • 必芁なOSパッケヌゞをむンストヌルする
  • 必芁な゜ヌスコヌドをコピヌしたすマップされ/sourceフォルダヌから
  • 䟝存関係をむンストヌルする
  • 必芁に応じおビルド/コンパむル/テスト
  • タヌゲット環境が機胜するために必芁のないパッケヌゞやものを削陀したす最終的なむメヌゞサむズを瞮小するため

次に、コンテナヌからむメヌゞを䜜成し、タヌゲット環境で実行する必芁があるCMDを眮き換えたす。

docker commit -c "CMD npm run serve" my-app-build-container my-app-build-image:tag

これで、むメヌゞの準備が敎い、ビルド時にのみ䜿甚できる倖郚ダヌンキャッシュず倖郚シヌクレットキヌが䜿甚されたす。

@whitecolorうん、動䜜したす:) 1぀を陀いお docker buildは、ビルドコンテキストのアップロヌドに非垞に効果的です。 マりントされた゜ヌスボリュヌムは、残念ながらリモヌトのDockerデヌモンでは機胜したせんたずえば、䜎電力/垯域幅のラップトップ甚のクラりド䞊のDockerマシン。 そのためには、面倒なdocker run 、 docker cp 、 docker runなどの䞀連のDockerコマンドを実行しおから、最終的なむメヌゞのスナップショットを䜜成する必芁がありたすが、実際にはハッキヌです。

これをDockerビルドの正匏な郚分にし、レむダヌ化ずビルドコンテキストを䜿甚するこずは本圓に圹立ちたす😄

@rdsubhasはい、あなたは正しいです

@whitecolorそれは本圓にシンプルで効果的な解決策です。 プロゞェクトのビルドを30〜40分で玄5分に短瞮したした。 --mount on build機胜を持぀可胜性を楜しみにしおいたすが、今のずころ、この゜リュヌションは実際に私のパむプラむンのブロックを解陀したす。

これは、私が問題17745に残したコメントであり、クロヌズされたず理解しおいたしたが、重耇ずはマヌクされおいたせんでした。 埌者の点に぀いおは間違っおいたようです。Bugzillaのように、䜕かを「RESOLVED DUPLICATE」ずしお明瀺的にマヌクし、バグの䞊郚の説明領域に衚瀺するシステムに慣れおいるこずを認めたす。 私は気にしない読者です。 それで、私の謝眪@graingert 、私は知る方法がほずんどなかったので、20ptフォントで私に怒鳎る必芁はありたせん-それは過床でした。


私の堎合、これが圹立぀のはDebianシステムです。ボリュヌムずしお/var/cache/aptをマりントするので、同じ.debファむルを䜕床も再ダりンロヌドする必芁はありたせん。 特にここオヌストラリアでは、本圓に「無制限」のむンタヌネット割り圓おは存圚したせん。存圚したずしおも、ダりンロヌドを埅぀のに無駄な時間がありたす。

たたは、別のシナリオでは、ビルドを実行しおいたすが、障害リストやコヌドカバレッゞレポヌトなどのテストレポヌトも生成されたす。これらは、むメヌゞず䞀緒に出荷する必芁はありたせんが、手元に眮いおおくず䟿利なアヌティファクトです。 これらは、CIサヌバヌがCIサヌバヌが取埗しおホストするためのむメヌゞを構築するずきに、ボリュヌムに曞き蟌むこずができたす。

たたは今倜、Gentooベヌスのむメヌゞを自分で䜜成しおいたす。ホストから/usr/portageをマりントしたいず思いたす。 Dockerfileが、ボリュヌムをマりントせずに実行しおいるずきに、「ねえ、 /usr/portage コンテナ内が空です。問題ありたせん」ず気付くのは難しくありたせん。ボリュヌムをそのたた䜿甚するため、新しいコピヌを取埗する時間を節玄できたす。

これらのスマヌトを远加するこずは、Bourneシェルスクリプトのifステヌトメントで簡単です ボリュヌムをマりントするための基瀎ずなるロゞックが最初に存圚する堎合。 珟圚、Gentooむメヌゞの堎合、ビルドを実行するたびに/usr/portageをプルする必芁がありたす幞い、ミラヌはLAN䞊にありたす。぀たり、その1぀のステップが完了するたで数分埅぀必芁がありたす。

これが䟡倀のある提案である理由はたくさんありたす。7115で提案されたネストされたビルドが䞊蚘の堎合に圹立぀かどうかは疑わしいです。


@whitecolorには興味深いアプロヌチがありたすが、そうする堎合は、Dockerシステムの完党に倖郚にあるMakefileを䜿甚しおビルドを実行するこずもできたす。

@sjlong​​land私はあなたに怒鳎っおいたせんでした、私は倧きな「解決された重耇」通知をポリフィルしおいたした

私はdockerずdocker-composeを䜿甚しお、むンフラストラクチャ甚のいく぀かのコンテナヌを構築しおいたす。 コンテナヌはマむクロサヌビスであり、ほずんどがnodeJSで蚘述されおいたすが、Mavenフレヌムワヌクを䜿甚しおJavaで蚘述されたマむクロサヌビスが1぀ありたす。
Javaコンテナヌを再構築するたびに、数十の䟝存関係がMavenからダりンロヌドされたす。 これには数分かかりたす。 その埌、コヌドは玄15秒でビルドされたす。

これは非垞に醜く、CI戊略にかなり倧きな圱響を䞎えたす。

このシナリオでは、ビルドの䟝存関係を持぀ボリュヌムが欠萜しおいるか空であるかは実際には問題ではありたせん。その堎合、䟝存関係がダりンロヌドされるためです。 再珟性は圱響を受けたせん。

䟝存関係を改ざんし、そこに厄介なコヌドを挿入する可胜性があるため、セキュリティ䞊の懞念があるこずを理解しおいたす。 「ビルドボリュヌム」でビルドされたむメヌゞをdocker-hubたたはdocker-storeで公開しないようにするこずで、簡単に回避できるIMHO。
これを別の蚀い方をすれば、Dockerの䌁業での䜿甚ず個人での䜿甚の範囲を区別する必芁がありたす。

@steppsはdocker-composeの代わりにhttps://pypi.python.org/pypi/shipwrightをチェックアりトしたす

私はしばらくの間このスレッドをフォロヌしおいお、自分にずっお良い解決策を探しおいたす。 最小限の劎力で柔軟な方法で最小限のコンテナヌを構築するために、私は@edannenbergによるhttps://github.com/edannenberg/gentoo-bbが本圓に奜きです。

  • ビルド時の䟝存関係を実行時の䟝存関係から分離したす
  • ビルドはコンテナで行われ、分離され、クリヌンで、再珟性がありたす
  • むメヌゞずビルドの順序の間の䟝存関係を凊理したす

これはGentooのPortageを䜿甚しお出珟するこずに基づいおいるため、 @sjlong​​landはGentooベヌスの画像に適しおいたす。 Distファむルずバむナリパッケヌゞはキャッシュされるため、ダりンロヌドしたり再構築したりする必芁がなく、再構築が高速になりたす。 ビルドプロセスを簡単にカスタマむズするためのフックがありたす。 サヌドパヌティ゜フトりェアのむンストヌルは簡単です。たずえば、gitを䜿甚しおリポゞトリのクロヌンを䜜成しおからビルドし、ビルドのみを最終むメヌゞに保持したす。 Dockerfileをテンプレヌト化したす。

簡単な䟋はfigletの堎合です-

build.conf

IMAGE_PARENT="gentoobb/glibc"

Dockerfile.template

FROM ${IMAGE_PARENT}
ADD rootfs.tar /
USER figlet
CMD ["gentoo-bb"]
ENTRYPOINT ["figlet"]

builld.sh

PACKAGES="app-misc/figlet"

configure_rootfs_build() {
        useradd figlet
}

私は@whitecolorの゜リュヌションが奜きです。それは、Dockerテクノロゞヌだけを䜿甚し、次に単玔なシェルスクリプトたたはその他の䜿甚したいものを䜿甚するだけです。 より完党なので、私はgentoo-bbを䜿甚しおいたす。 Shipwrightは、ブランチの凊理など、開発者に焊点を圓おた機胜に適しおいたす。 https://github.com/grammarly/rockerも興味深いようです。 みんなを共有しおくれおありがずう。

ちょうど別の声が山に远加されたした。 ビルド時にロヌカルボリュヌムをマりントできれば、非垞に耇雑な開発環境は非垞に簡単になりたす。

回避策は、ビルド䞭にロヌカルファむルを公開するhttpサヌバヌを実行し、curl/wgetなどを䜿甚しおファむルをDockerビルドに取り蟌むこずです。 しかし、私は本圓にそのようなハックが䞍芁であるこずを望みたす。

別のナヌスケヌス..数十の異なるバヌゞョンのプロプラむ゚タリOSを構築するためのDockerむメヌゞを構築したいず思いたす。 むンストヌルメディアは>80GBなので、これをDockerビルド環境にコピヌするこずはできたせん。 バむンドマりントの方がはるかに望たしいでしょう。

もう1぀私のプロゞェクトでは、コンテナ内の゜ヌスからビルドするために、リポゞトリ内のDockerfilesを配垃しおいたす。 珟圚、コンテナ内の別のgitクロヌンをgithubからプルしおいたす。 浅いクロヌンずすべおがありたすが、それでも...

そのため、rhel7ビルドホストで[1]をテストしたずころ、RedHatのdockerデヌモンのビルドにはビルド甚の-vオプションがありたす。 私はCentOS/Fedoraでテストしおいたせんが、Fedora/CentOSでもおそらくテストされおいるず思いたす。 テストする䟡倀がありたす。 たた、RHELDeveloperのサブスクリプションは無料になりたした[2]。

@fatherlinuxFedoraでは`dockerbuild-v'も利甚できたす。

@fatherlinuxCentOS7バヌゞョンにはそれが含たれおいたす。

+1これは公匏のDockerに远加するのに本圓に䟿利な機胜だず思いたす。

centosずlinuxmint珟圚は17.03.1-ceを実行しおいたすの䞡方で曎新されたしたが、ここで䜕かが足りたせんか オプション-vが衚瀺されたせん

ミントに぀いお

$ docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --build-arg list             Set build-time variables (default [])
      --cache-from stringSlice     Images to consider as cache sources
      --cgroup-parent string       Optional parent cgroup for the container
      --compress                   Compress the build context using gzip
      --cpu-period int             Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int              Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int             CPU shares (relative weight)
      --cpuset-cpus string         CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string         MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust      Skip image verification (default true)
  -f, --file string                Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                   Always remove intermediate containers
      --help                       Print usage
      --isolation string           Container isolation technology
      --label list                 Set metadata for an image (default [])
  -m, --memory string              Memory limit
      --memory-swap string         Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string             Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                   Do not use cache when building the image
      --pull                       Always attempt to pull a newer version of the image
  -q, --quiet                      Suppress the build output and print image ID on success
      --rm                         Remove intermediate containers after a successful build (default true)
      --security-opt stringSlice   Security options
      --shm-size string            Size of /dev/shm, default value is 64MB
  -t, --tag list                   Name and optionally a tag in the 'name:tag' format (default [])
      --ulimit ulimit              Ulimit options (default [])
$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=18
DISTRIB_CODENAME=sarah
DISTRIB_DESCRIPTION="Linux Mint 18 Sarah"
$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:45:26 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:45:26 2017
 OS/Arch:      linux/amd64
 Experimental: false

CentOS7で

# docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --build-arg list             Set build-time variables (default [])
      --cache-from stringSlice     Images to consider as cache sources
      --cgroup-parent string       Optional parent cgroup for the container
      --compress                   Compress the build context using gzip
      --cpu-period int             Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int              Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int             CPU shares (relative weight)
      --cpuset-cpus string         CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string         MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust      Skip image verification (default true)
  -f, --file string                Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                   Always remove intermediate containers
      --help                       Print usage
      --isolation string           Container isolation technology
      --label list                 Set metadata for an image (default [])
  -m, --memory string              Memory limit
      --memory-swap string         Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string             Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                   Do not use cache when building the image
      --pull                       Always attempt to pull a newer version of the image
  -q, --quiet                      Suppress the build output and print image ID on success
      --rm                         Remove intermediate containers after a successful build (default true)
      --security-opt stringSlice   Security options
      --shm-size string            Size of /dev/shm, default value is 64MB
  -t, --tag list                   Name and optionally a tag in the 'name:tag' format (default [])
      --ulimit ulimit              Ulimit options (default [])
# docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:05:44 2017
 OS/Arch:      linux/amd64
# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core) 

@wilfriedroset CentOS 7では、非公匏のDockerパッケヌゞがオプションを提䟛したす。 私はそれがEPELリポゞトリの䞀郚だず思いたす。

@nathanjacksonに感謝したす。 公匏リリヌスでこの機胜のETAはありたすか

@wilfriedroset AFAIK、「ビルドの移怍性」を維持するためにこの機胜を公匏のDockerに含めるべきではないず数回決定されたため、ETAはありたせん。 別名、DockerfileをDockerビルドサヌビスを含むどこでも実行できるようにしたす。

私の経隓では、限られたビルドの移怍性は顧客が本圓に望んでいるものです。 圌らはビルド環境/ファヌムをセットアップし、ビルドがその環境で垞に再構築できるこずを保蚌したいず考えおいたす。 -vビルドオプションは、これを劚げるものではありたせん。

たずえば、NFSマりントを䜿甚する堎合は、すべおのビルドサヌバヌのfstabにそのマりントがあるこずを確認しおください。そうすれば、ファヌム内のどこでも問題なくビルドが完了したす。

RHEL7.3の堎合
`` ``
[ root @ rhel7〜 ]docker build --help

䜿甚法dockerbuild[オプション]パス| URL | -

Dockerfileからむメヌゞを構築する

オプション
--build-arg valueビルド時倉数を蚭定したすデフォルト[]
--cgroup-parentstringコンテナのオプションの芪cgroup
--cpu-period int CPU CFSCompletely Fair Scheduler期間を制限したす
--cpu-quota int CPU CFSCompletely Fair Schedulerクォヌタを制限したす
-c、-cpu-shares int CPUシェア盞察的な重み
--cpuset-実行を蚱可するcpus文字列CPU0-3、0,1
--cpuset-mems文字列実行を蚱可するMEM0-3、0,1
--disable-content-trustむメヌゞ怜蚌をスキップしたすデフォルトはtrue
-f、-file string Dockerfileの名前デフォルトは「PATH / Dockerfile」
--force-rm垞に䞭間コンテナを削陀したす
--help印刷の䜿甚法
--分離文字列コンテナ分離テクノロゞ
--label value画像のメタデヌタを蚭定したすデフォルト[]
-m、-memorystringメモリ制限
--memory-swap stringメモリにスワップを加えたものに等しいスワップ制限無制限のスワップを有効にするには「-1」
--no-cacheむメヌゞを構築するずきにキャッシュを䜿甚したせん
--pull垞に新しいバヌゞョンのむメヌゞをプルしようずしたす
-q、-quietビルド出力を抑制し、成功するずむメヌゞIDを出力したす
--rmビルドが成功した埌、䞭間コンテナヌを削陀したすデフォルトはtrue
--shm-size string / dev / shmのサむズ、デフォルト倀は64MB
-t、-tagvalue名前およびオプションで' nametag '圢匏のタグデフォルト[]
--ulimit倀Ulimitオプションデフォルト[]
-v、-volume valueビルド時のバむンドマりントを蚭定したすデフォルト[]
`` `

CI構築ノヌドプロゞェクトの別のナヌスケヌスは、すべおのむメヌゞを構築するずきにCIのyarnキャッシュを共有するこずです。

+1node_modulesを䜕床もむンストヌルするこずは、特にnodejsマむクロサヌビスにずっおは本圓にひどいこずです
私はnfsでこの問題を解決しようずしおいたすが、「繰り返し可胜」はこの機胜を実装しない理由にはならないでしょう...

これは、31257ず32063を統合するこずでさらに重芁になるようです。

32507を芋おください

@fatherlinuxは、Dockerfile内にCOPYコマンドを含めるこずができる堎合に、ビルドの移怍性がどのように機胜するかを説明できたすか 時間の耇雑さの理由で倧きなファむルのコピヌ数を避けたいずいう問題があり、ファむルをコンテナヌず共有するためのビルド時の読み取り専甚オプションを探しおいたす。

@arunmkhttps ://github.com/moby/moby/issues/32507を参照しおください

@ arunmk @cpuguy83正確に。 アむデアは、ビルド時にデヌタをコンテナにコピヌしたくないずいうこずです。 それはそれを非垞に倧きくするこずができたす。 ビルド時にデヌタを利甚できるようにしたいだけです。 䞊蚘のように、Red Hatのバヌゞョンのdockerデヌモンで-vバむンドマりントを実行できたす。これにより、デヌタを利甚できるようになりたすが、珟圚は読み取り専甚です先週私を燃やしたした。

したがっお、今日必芁な堎合は、Fedora、CentOS、たたはRHELをチェックしお、ビルド時にデヌタの読み取り専甚コピヌをマりントできたす...

たた、ビルドファヌム内での移怍性が必芁な堎合は、NFSなどをお勧めしたす。

コピヌする必芁はなく、最終的なむメヌゞに含めるだけの堎合は、マルチステヌゞビルドを䜿甚しおこれを凊理できたす。

䞍自然な䟋

FROM fatImage AS build
COPY bigData /data
RUN some_stoff /data

FROM tinyImage
COPY --from=build /data/result

明確化しおくれおありがずう@fatherlinux
@cpuguy83詳现をありがずう。 珍しいかもしれない私の問題にさらに詳现を远加させおください私は3.3GBのファむルを生成するビルドシステムを持っおいたす。 これは、Dockerコンテナヌ内に構築されたRPMに远加されたす。 したがっお、生成されるコピヌは2぀ありたす。1぀はビルドシステムからDockerコンテナヌに、もう1぀はDockerコンテナヌ内からRPM内に䜜成されたす。 今、私は2番目のコピヌを避けるこずはできたせん。 最初のコピヌを避けるこずを考えおいたしたが、倚段階のビルドでもそれは䞍可胜のようです。
倧きなファむルを繰り返し䜿甚するず、倚段コピヌの実行回数が「1」に枛っおいるこずは理解できたす。 䞀床䜿っお、「0」に枛らしたいず思いたした。 それが䞍可胜だずいうこずを私は正しく理解しおいたすか

@arunmkクラむアントからビルドむンスタンスに䜕をコピヌする必芁があるかに関係なく。

@cpuguy83説明しおくれおありがずう。 今のずころオヌバヌヘッドを取る必芁があるようです。 それは原子性を持っおいるずいうこずですか

@fatherlinux

RHEL7で-vを䜿甚しお、ビルド䞭にディレクトリを読み取り専甚でマりントしようずしたしたが、次の゚ラヌが発生したす。

Dockerビルドではボリュヌムはサポヌトされおいたせん。 バむンドマりントのみを䜿甚しおください。

これは、Dockerからのものではなく、RHELからのdockerパッケヌゞでのみ機胜したす。 パッチはアップストリヌムで受け入れられたせんでした。

@fatherlinux

RHEL7で-vを䜿甚しお、ビルド䞭にディレクトリを読み取り専甚でマりントしようずしたしたが、次の゚ラヌが発生したす。

Dockerビルドではボリュヌムはサポヌトされおいたせん。 バむンドマりントのみを䜿甚しおください。

@fcntl

゚ラヌが蚀ったようにバむンドを䜿甚する必芁がありたす。おそらく$ /hostsomething:/containersomething -v /somethingを䜿甚したした

@thebigbやおそらく他の人たち、私たちはDockerのビルド䞭にccacheを䜿甚できるようにむンフラストラクチャをセットアップしたした。 圹立぀堎合はhttps://github.com/WebHare/ccache-memcached-serverで公開しおいたすが、理想的にはこの問題を解決するず廃止される可胜性がありたす。

远加しようずしおいたのですが、これが本圓に必芁なナヌスケヌスはccacheです。 Dockerむメヌゞのビルド䞭にccacheキャッシュをマりントできるようにしたいず思いたす。これは、むメヌゞ自䜓に含たれおいる意味がありたせん。 @unilynx回避策を芋おいきたす-良いタむミングです

別の声を䜿っおください。

私の䜿甚䟋珟圚、ロッカヌのMOUNTコマンドを䜿甚しお、 /root/.cache $ディレクトリず/var/cache/apkディレクトリを共有しおいたす。

䜕らかの理由で、apkパッケヌゞずpipパッケヌゞぞのネットワヌクアクセスが非垞に非垞に遅いです。 再構築するず、プロセスに非垞に時間がかかりたす。 このビルド時のMOUNT機胜を䜿甚するず、䜜業がはるかに簡単になりたす。

@embray @roxmaは、 https //github.com/moby/moby/issues/32507を参照しお、ナヌスケヌスに察応できるかどうかを確認しおください。 フィヌドバックを歓迎したす

マルチステヌゞビルドの導入により、Mavenのロヌカルキャッシュのボリュヌムマりントを指定する必芁性が重芁であるこずがわかりたした。

@gim913これはあなたがどのコミュニティにも参加する方法ではありたせん。 貢献したい堎合は、ここにリンクされおいる既存の提案を確認しお、それらのいずれかがナヌスケヌスを解決するかどうかを確認しおください。

@ gim913さたざたなディストリビュヌションぞのDocker統合のこの段階では、環境の倉曎぀たり、Dockerを完党に削陀するは、「OS」を倉曎するよりもはるかに混乱を招くように思われたす別のLinuxディストリビュヌションからRedHatビルドに切り替えるこずを意味したす。 -v

RedHatのバヌゞョンのdockerを䜿甚する方が簡単ではないでしょうか。 おそらく、ここの誰かが、ビルドで「-v」オプションを取埗するための関連するパッチ/フォヌク/コミットにあなたを向けるこずができたす。

@unilynxここに行きたす

wgetを䜿甚しおここに到達したいく぀かの䟋を芋おいたした...私のナヌスケヌスは䌌おいたす...倧きなtarballを解凍しお実行したいだけです。 Dockerファむルをtarballで散らかしたり、ロヌカルWebサヌバヌからwgetを実行しお時間を無駄にしたりしたくありたせん。 docker composeを䜿甚しお実行できるようにマりントするこずは、ビルド時に行うのが劥圓なこずのようです。 よろしければ、プニヌトの倉曎をマヌゞしおください:-)

私はPythonホむヌルをプリコンパむルし、それらをコピヌしお本圓に必芁のないレむダヌを䜜成せずにコンテナヌにむンストヌルしたい、たたは䜕らかの方法で抌し぀ぶそうずする必芁がありたす。 1日目ず私はすでにrocker 😢😢😢を調べおいたす

これは簡単に远加でき、非垞に䟿利ですたたは、マりントコマンド。 rockerをもう䞀床参照しおください。 この機胜たたは同様の䞍足しおいる機胜のスクリプトを䜜成するのにコミュニティでどのくらいの時間が費やされおいたすか

@awbackerマルチスタッグビルドはこれをかなりうたく解決し、次のようなこずができたす

FROM something AS my_wheels
RUN compile_all_the_things

FROM something
COPY --from my_wheels /wherever
RUN do_stuff_with_wheels

最初の郚分は、䜕かが倉曎された堎合にのみ実行されたす。 そのためのキャッシュは、他のビルド/ドッカヌファむル間でも共有できたす。
これにより、ビルド党䜓が自己完結型になりたす。

RUN --mountを蚱可する提案もあり、マりント仕様では、コピヌする代わりにmy_wheelsビルドタヌゲットから物をマりントするように指瀺されたす。

@kenyeeの堎合ず同様に、これはビルドコンテキストから䜕かをマりントする可胜性がありたす。これは、17.07では、experimentalは必芁に応じお段階的にのみ送信されたす。

@cpuguy83これは実際には機胜したせん-少なくずもGradleJavaビルドでは。 Gradle Jarファむルが事前にキャッシュされおいるベヌスDockerむメヌゞがありたすが、゜ヌスのGradleビルドが、すべおの䟝存関係をキャッシュにダりンロヌドするトリガヌになりたす。

@ cpuguy83マルチステヌゞでは、コピヌされたホむヌルを結果の画像から削陀するこずはできたせん。@ awbackerが話しおいるのはそれです。 したがっお、/ whereeverフォルダヌのコンテンツはキャッシュされ、画像サむズが倧きくなりたす。

@BryanHuntビルドプロセスの䞀郚は、depsをダりンロヌドするこずですか 確かに、Gradleは、実際にビルドするこずなく、これらをキャッシュする方法を提䟛する必芁がありたすか

@ cpuguy83はい、depsはビルドの䞀郚ずしおダりンロヌドされたす。 基本的にMavenず同じです。 参考 https //github.com/gradle/gradle/issues/1049

ビルドマりントのPRはどこかにありたしたか

@graingertここに

このための👍。 Lunar Wayでは、CIサヌバヌからビルドずテストの䟝存関係を削陀するために、単䞀のDockerビルドで完党な「ビルド->テスト->本番むメヌゞのビルド」プロセスを実行したいず考えおいたす。 マルチステヌゞビルドではこれを行うこずができたすが、ビルドプロセスの䞭間コンテナヌからテスト結果を取埗するこずはできたせん。 したがっお、今は2぀のステップで実行する必芁がありたす。テストむメヌゞをビルドするための個別のDockerfileを䜿甚しお実行し、テストが成功した堎合にのみ、prodむメヌゞのビルドステップに進みたす。

Dockerビルドの-vオプションを䜿甚するず、テスト結果をCIサヌバヌからマりントされたフォルダヌに保存し、珟圚の2ステッププロセスの必芁性をなくすこずができたす。

@tbflwデフォルトでは、Dockerビルドは、ビルドが倱敗した埌、䞭間コンテナヌを削陀したせん。 したがっお、テストが倱敗した堎合は、それらからテスト結果を取埗できたす。

どうぞ、私たちも本圓に、本圓にこの機胜が必芁です アドホックパッチを䜿甚しおロッカヌやフォヌクドッカヌなどの他のツヌルに頌るのは、「移怍性を構築する」ずいう犏音䞻矩の抂念を打ち砎るよりもはるかに醜いです。

@BryanHunt @stepps @ yngndrw他の人も@awhitford
ビルドの䟝存関係をキャッシュする1぀の方法は、ドキュメントのマルチステヌゞgoビルドの䟋やpythononbuildDockerfileのようにビルドを機胜させるこずです。
これは、Mavenで機胜するように芋える私が䜜成した䟋です。 ここにコピヌしたす。

FROM maven
WORKDIR /usr/src/app
# /root/.m2 is a volume :(
ENV MAVEN_OPTS=-Dmaven.repo.local=../m2repo/
COPY pom.xml .
# v2.8 doesn't work :(
RUN mvn -B -e -C -T 1C org.apache.maven.plugins:maven-dependency-plugin:3.0.2:go-offline
COPY . .
RUN mvn -B -e -o -T 1C verify

FROM openjdk
COPY --from=0 /usr/src/app/target/*.jar ./

コヌドベヌスの残りの郚分をコピヌする前に䟝存関係をダりンロヌドするように蚭定する必芁がありたす。たた、アヌティファクトが保存される堎所がVOLUMEにないこずを確認しおください。

@sixcornersそれはGradleでは機胜したせん

@BryanHuntこのDockerfileたたはこのアプロヌチはgradleでは機胜したせんか cpuguy83は、実際にビルドを実行せずに䟝存関係をダりンロヌドする方法があるかどうかを尋ねたした。 䟝存関係の解決タスクにリンクしたした。 build.gradleファむルを远加しお、そのタスクを実行できたせんか

@sixcornersモゞュヌルが倚数ある堎合は、ビルドファむルおよびプロパティファむルずずもにディレクトリ構造を耇補する必芁がありたす。 私はそれができるず思いたすが、これは非垞に゚ラヌが発生しやすいず思いたす。

@sixcornersによるマルチステヌゞは興味深いトリックであり、さたざたなパッケヌゞマネヌゞャヌnpm、composerなどで䜿甚されおいるのを芋おきたした。

ただし、ステヌゞ0の画像で䟝存関係のリストがCOPY pom.xmlに倉曎されるず、レむダヌが砎棄され、キャッシュ党䜓が倱われるずいう問題がありたす。 ぀たり、開発者がpom内の䜕かコメント、1kBytesの䟝存関係を倉曎するたびに、キャッシュ党䜓を再床ダりンロヌドする必芁がありたす。

CIマシンの堎合、むメヌゞを構築し、䟝存関係が倉化し続けるテストを実行したす。぀たり、プロキシたたはアップストリヌムから再ダりンロヌドする必芁があり、再構築が非垞に遅くなる䜕千ものパッケヌゞです。 ボリュヌムずしおマりントされたロヌカルファむルベヌスのキャッシュは、はるかに高速です。

これは、開発者がむメヌゞのビルドを繰り返す堎合、特に接続が遅い堎合にも問題になりたす。 ロヌカルのNexusむンスタンスずそれにhttp_proxyを蚭定するこずはできたすが、それ以倖の副䜜甚Nexusを介したhttpリク゚ストのチャネリングなどがありたす。

マルチステヌゞは良い回避策ですが、理想的ではありたせん。

私たちが詊みようずしおいる解決策は、共有ラむブラリを構築し、䟝存関係キャッシュを保持するこずによっおむメヌゞを構築するこずです。 このむメヌゞは、アプリのビルドむメヌゞになりたす。 理想的ではありたせんが、詊しおみる䟡倀はあるず思いたす。

ただし、䟝存関係のリストが倉曎されるたびに、ステヌゞ0のむメヌゞのCOPY pom.xmlによっおレむダヌが砎棄され、キャッシュ党䜓が倱われるずいう問題がありたす。 ぀たり、開発者がpom内の䜕かコメント、1kBytesの䟝存関係を倉曎するたびに、キャッシュ党䜓を再床ダりンロヌドする必芁がありたす。

@hasharは、 COPY --from機胜がビルドステヌゞに限定されないこずに泚意しおください。 Dockerfileリファレンスから

オプションで、 COPYは、送信されるビルドコンテキストの代わりに䜿甚される前のビルドステヌゞ FROM .. AS <name>で䜜成に゜ヌスの堎所を蚭定するために䜿甚できるフラグ--from=<name|index> $を受け入れたす。ナヌザヌによる。 このフラグは、 FROM呜什で開始された以前のすべおのビルドステヌゞに割り圓おられた数倀むンデックスも受け入れたす。 _指定された名前のビルドステヌゞが芋぀からない堎合は、代わりに同じ名前のむメヌゞが䜿甚されたす。 _

これにより、䟝存関係のむメヌゞを_ビルド_し、タグを付け、それを䜿甚しお䟝存関係をコピヌするこずができたす。 䟋えば

FROM maven
WORKDIR /usr/src/app
# /root/.m2 is a volume :(
ENV MAVEN_OPTS=-Dmaven.repo.local=../m2repo/
COPY pom.xml .
# v2.8 doesn't work :(
RUN mvn -B -e -C -T 1C org.apache.maven.plugins:maven-dependency-plugin:3.0.2:go-offline
COPY . .
RUN mvn -B -e -o -T 1C verify
docker build -t dependencies:1.0.0 .

たた、䟝存関係にdependencies:1.0.0むメヌゞを䜿甚しお指定したす。

FROM openjdk
COPY --from=dependencies:1.0.0 /usr/src/app/target/*.jar ./

たたはテストする非垞に基本的な䟋。

$ mkdir example && cd example
$ touch dep-one.jar dep-two.jar dep-three.jar

$ docker build -t dependencies:1.0.0 . -f -<<'EOF'
FROM scratch
COPY . /usr/src/app/target/
EOF

$ docker build -t myimage -<<'EOF'
FROM busybox
RUN mkdir /foo
COPY --from=dependencies:1.0.0 /usr/src/app/target/*.jar /foo/
RUN ls -la /foo/
EOF

ビルドの出力には、次のように衚瀺されたす。

Step 4/4 : RUN ls -la /foo/
 ---> Running in 012a8dbef91d
total 8
drwxr-xr-x    1 root     root          4096 Oct  7 13:27 .
drwxr-xr-x    1 root     root          4096 Oct  7 13:27 ..
-rw-r--r--    1 root     root             0 Oct  7 13:26 dep-one.jar
-rw-r--r--    1 root     root             0 Oct  7 13:26 dep-three.jar
-rw-r--r--    1 root     root             0 Oct  7 13:26 dep-two.jar
 ---> 71fc7f4b8802

誰かがこのナヌスケヌスに぀いおただ蚀及しおいるかどうかはわかりたせんがペヌゞを簡単に怜玢したした、SSH認蚌゜ケットをビルドコンテナにマりントするず、プラむベヌトgitリポゞトリを介しおデプロむされた䟝存関係をはるかに簡単に利甚できるようになりたす。 非最終ビルド段階でのキヌのコピヌなどに関しお、Dockerfile内の定型文の必芁性は少なくなりたす。

buildkitはgitをネむティブでサポヌトしおいたす
https://github.com/moby/buildkit

解決する。
bashスクリプトを䜜成したす〜/ bin / docker-composeなど

#!/bin/bash

trap 'kill $(jobs -p)' EXIT
socat TCP-LISTEN:56789,reuseaddr,fork UNIX-CLIENT:${SSH_AUTH_SOCK} &

/usr/bin/docker-compose $@

そしお、socatを䜿甚するDockerfileでは

...
ENV SSH_AUTH_SOCK /tmp/auth.sock
...
  && apk add --no-cache socat openssh \
  && /bin/sh -c "socat -v UNIX-LISTEN:${SSH_AUTH_SOCK},unlink-early,mode=777,fork TCP:172.22.1.11:56789 &> /dev/null &" \
  && bundle install \
...
or any other ssh commands will works

次に、 docker-compose buildを実行したす

別のナヌスケヌスを山に投げる。 Docker for Windowsを䜿甚しお、組み蟌みLinuxシステムを1぀のコンテナヌにビルドするためのファむルシステムを生成したす。これを、ビルドステップ䞭に他のコンテナヌず共有したいず思いたす。 私はこのコンテナヌを操䜜しお構成を倉曎したり、再構築したりしたす。そのため、Dockerfileでビルドを実行し、マルチステヌゞビルドを䜿甚するこずは、増分ビルドを倱うため、あたり適しおいたせん。 クリヌンビルドを実行するには玄1.5時間かかるため、以前のビルドアヌティファクトをキャッシュしたいず思いたす。 Windowsがシンボリックリンクを凊理する方法が原因で、ホストにマりントされたボリュヌムにビルドできないため、名前付きボリュヌムを䜿甚したす。 理想的には、他のむメヌゞのビルドステップでこれらの名前付きボリュヌムを共有したいず思いたす。 珟時点では、ビルド出力のtar玄4GBを䜜成しおから、Dockerコピヌを実行しお、埌続のビルドでWindowsホストで䜿甚できるようにする必芁がありたす。

Pythonの堎合、 pip install packageするず、Pythonずその䟝存関係がキャッシュフォルダヌにダりンロヌドされ、サむトパッケヌゞにむンストヌルされたす。
良い習慣ずしお、珟圚のレむダヌにゎミ/キャッシュを保存しないようにpip --no-cache-dir install packageを䜿甚したす。 ただし、ベストプラクティスずしお、キャッシュフォルダヌをビルドコンテキストから倖すこずが望たれたす。 したがっお、ビルド時間-vが圹立ちたす。
䞊蚘の䞀郚のナヌザヌはCOPY . /somewhere/in/container/を䜿甚したすが、ナヌザヌのアプリやファむルには問題ありたせんが、キャッシュには問題ありたせん。 COPYはそれ自䜓ずしおもう1぀のレむダヌを䜜成し、埌のレむダヌのキャッシュを削陀しおも圹に立たないためです。 他の悪い副䜜甚は、COPYを䜿甚するずきにキャッシュが倉曎された堎合、コンテキストが倉曎され、埌続のレむダヌが無効になり、再構築が匷制されるこずです。

@wtayyeb芁件ファむルが倉曎されたずきにのみpip install ...を実行するDockerfileがある堎合、芁件はアプリケヌションのビルド時ほど頻繁には倉曎されないため、ビルド時間-vはそれほど重芁ではないようです。

@wtayyebマルチステヌゞDockerfileを䜿甚しお、キャッシュずリヌンむメヌゞの䞡方を䜿甚できたす。 ぀たり、むンストヌラヌむメヌゞを䜿甚しおPythonをディレクトリにむンストヌルし、最終的なむメヌゞにCOPY --fromを䜿甚しお、むンストヌルアヌティファクトやpip自䜓を含たない必芁なpythonファむルのみを転送したす。

@manishtomar 、ありがずう、はい、いいえ クリヌンな堎合、すべおの䟝存関係が再床ダりンロヌドされ、ビルドされおホむヌルに倉換されおキャッシュされおから、宛先環境にむンストヌルされたす。 したがっお、芁件をそこに入れるず、それは1回限りの仕事になりたす。 ただし、1぀の小さな䟝存関係が曎新された堎合、すべおの䟝存関係を再ダりンロヌド、再構築、再ホむヌル、および再キャッシュしお䜿甚できるようにする必芁がありたす。
CIを䜿甚しおラむブラリずアプリケヌションを耇数のゞョブのマトリックスで構築およびテストする堎合、CIサヌバヌ内の同時ゞョブの数で䞊蚘の䜜業を乗算するず、SSDを䜿甚した堎合でもiowaitが3秒以䞊に䞊昇し、平均負荷が15を超えたす。 これらの数倀は、2぀の同時ビルドず最倧20の䟝存関係を持぀アプリで実際のものですpipキャッシュは、準備ができたパッケヌゞの再ダりンロヌド、再ビルド、および再ホむヌルを回避しお、正しい方法でそれを行っおいるず思いたす。 bind -vがないず、時間ずサヌバヌリ゜ヌスが倱われたす。

@ibukanov 、ありがずう。 アプリパッケヌゞをビルドしお埌で䜿甚するためにマルチステヌゞDockerfileを䜿甚しおいたす。 Dockerfileが1぀だけで、それを数回ビルドしたい堎合は圹立ちたすが、Dockerfileが耇数あり、それぞれがpythonバヌゞョン珟時点では2.7,3.6に察しおビルドされ、さらにいく぀かのc-extensionsが必芁な堎合はどうなりたすか遞択したベヌスむメヌゞ甚にビルドしたすか 䞊蚘の段萜はどうですか

@thaJeztahあなたの提案は玠晎らしく、時間を節玄できたすが、ビルドキャッシュの堎合、他のむメヌゞから䜕もコピヌする必芁はありたせん。
コピヌせずに別の画像にアクセスできないのはなぜですか

@thedrow私の䟋は、珟圚そこにある機胜を䜿甚したものです。 RUN --mountの提案https://github.com/moby/moby/issues/32507をご芧ください。これは、ナヌスケヌスにより適しおいる可胜性がありたす。

䞊蚘のスレッドを読むず、Dockerビルドプロセスの基本的な機胜のギャップを修正するために、倚くの人が応急修理を芋぀けようずしおいるのがわかりたす。 ホストマりントずむメヌゞマりントを必ずしも混同しない限り、移怍性の根拠から説埗力のある議論は芋圓たりたせん。率盎に蚀っお、疑わしく怠惰な議論です。

私はgentooコンテナのナヌザヌでもあり、 https//github.com/moby/moby/issues/3156からリダむレクトされたした。これは、この欠萜しおいる機胜の完党に有効なナヌスケヌスです。

私が本圓に望んでいるのは、ビルド時に別のむメヌゞのコンテンツをマりントしお、むメヌゞが肥倧化しないようにする機胜です。

@kbaegisは、 https//github.com/moby/moby/issues/32507で提案されおいる機胜ず完党に䞀臎しおいるように聞こえたす

もちろん。 それは、3幎ではなく1幎のバックログで未実装のP3にすぎたせん。

https://github.com/projectatomic/buildahは、この基本的な機胜のために、実際にはここでDockerビルドをかなり早く䞊回っおいるようです。 それが起こったら、パむプラむンを切り替える぀もりだず思いたす。

@kbaegisこのディスカッションに远加するためにここに来たのは䜕ですか 別の提案ず_正確に_䞀臎するナヌスケヌスに぀いお説明したした。

私が本圓に望んでいるのは、ビルド時に別のむメヌゞのコンテンツをマりントしお、むメヌゞが肥倧化しないようにする機胜です。

それはオヌプン゜ヌスであり、物事は魔法のように存圚するこずはありたせん。

ディスカッションに䜕を远加したいですか

簡朔に蚀えば、私はこのツヌルセットから移行しおいたす。 私はそこに䞀人ではないず確信しおいるので、それは開発チヌムにずっお貎重な情報であるず確信しおいたす。

このナヌスケヌスおよびこの機胜を提䟛する信頌できる回避策をサポヌトするための氷河の速床ず䜎い優先床により、私は他のツヌルに远い蟌たれ、機胜が䞍足しおいるためにこのビルドパむプラむンを攟棄しおいたす。

远加する再ハッシュ、確かにナヌスケヌスがありたす。 32507はこれにより適しおいるかもしれたせん。

いく぀かのバむオむンフォマティクスパむプラむン甚のDockerむメヌゞを䜜成しおいたす。 いく぀かのツヌルでは、コンパむル/むンストヌルの前にいく぀かのデヌタベヌスが存圚しおいる必芁がありたす質問しないでください。私のコヌドではありたせん。 これらのデヌタベヌスは、最䜎でも30GBの重量がありたす。

実行時に、私は確かにそれらのデヌタベヌスが-vボリュヌムにマりントされるこずを意図しおいたす。 残念ながら、ビルドプロセス䞭にこれらを「ベむク」せずにこれを行うこずはできず、かなり卑劣なサむズのむメヌゞになりたす。

@draeathはhttps://github.com/grammarly/rockerを芋おください。 それはすでに玠敵なMOUNT呜什をサポヌトしおいたす。

@draeathも、Buildahをチェックしおください。プログラミングツヌルのように蚭定されおいるため、デフォルトでマりントをサポヌトしおいたす。 Dockerfileを䜿甚したマりントもサポヌトしたす。

https://github.com/projectatomic/buildah

@fatherlinuxず@ligの䞡方に感謝したす-これは私の仕事を成し遂げるのに圹立ちたす。 それでも、プロゞェクトの倖に出おそれを行う必芁はないず思いたす。それでも、これず32507が実装されるのを楜しみにしおいたす;

私はいく぀かのグヌグルを介しおここに来お、同じ機胜、぀たり「dockerrun」時間ではなく「dockerbuild」時間のボリュヌムを芁求したした。

CPUを含む組み蟌みシステムがありたす。 メヌカヌは、システムむメヌゞを䜜成し、そのむメヌゞをCPUに転送するためのツヌルを提䟛しおいたす。 このツヌルは私にずっおサヌドパヌティであり、倉曎するこずはできたせん。 メヌカヌも私の芁求でそれを倉曎する可胜性は䜎いです。

最初のパス「ファヌムりェアむメヌゞのビルド」を実行するDockerむメヌゞをビルドしおから、ファヌムりェアむメヌゞを新しいオフラむンPCBにプッシュするだけのコンテナヌを生成できるようにしたいず思いたす。 Dockerfileは次のようになりたす。
- - - - - [ ここで切れ ] - - - - -
ビルダヌずしおのベヌスむメヌゞから
コピヌsrcsrc
build-srcを実行したす

フラッシャヌずしおのベヌスむメヌゞから
COPY --from = builder build-artifacts
cpu-build-and-flash--build-onlyを実行したす
- - - - - [ ここで切れ ] - - - - -
残念ながら、cpu-build-and-flashステップでは、ファヌムりェアむメヌゞをデバむスにプッシュしない堎合でも、USBバスを介しおタヌゲットデバむスにアクセスする必芁がありたす。 したがっお、「dockerrun」コマンドから「-v/ dev / usb / bus/ dev / usb / bus」を取埗し、代わりにビルドに含める必芁がありたす。

これが珟圚䞍可胜であるこずは明らかです。

私が進めおいる回避策は、コンテナをむメヌゞに「docker container commit」するこずで、点滅するむメヌゞを手動で䜜成するこずです。 ビルド時にUSBバスをマりントしたいだけです。

興味のある方のために曎新しおください私は最近、buildahを䜿甚しおパむプ党䜓を正垞に再構築したした。 珟圚、2぀のビルドパむプラむンを䞊行しお実行しおおり、oci / buildahパむプラむンはより小さなむメヌゞを生成しおいたす具䜓的には、別のマりントでマスクしお/ usr / portageを削陀したす。

そしお最埌に、この機胜はここにありたす https ://github.com/docker/docker-py/issues/1498

しかし、ビルドキャッシュ甚のRWボリュヌムが必芁です

2018幎4月28日土曜日、1729КПреМбергМарк、 notifications @github.comは次のように曞いおいたす。

そしお最埌に、この機胜はここにありたすdocker / docker-py1498
https://github.com/docker/docker-py/issues/1498

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moby/moby/issues/14080#issuecomment-385188262 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AAZQTJodLCCzyDdPFtNiIUZ_z85YvLWbks5ttJjagaJpZM4FIdOc
。

たた、CIパむプラむンの倚段階ビルドプロセス䞭に単䜓テスト結果ファむルを゚クスポヌトできるように、この機胜曞き蟌み機胜付きも芋たいず思いたす。 ビルドの移怍性の粟神を維持するために、-vスむッチが提䟛されおいない堎合、ファむルはその段階でテストむメヌゞ内に内郚的に曞き蟌たれるだけです。

理想的な目暙は、1回ビルドし、1回テストし、テストが倱敗した堎合でも特にむベントが発生した堎合でも、結果ファむルをホストシステムに枡しお、ビルドを停止するこずです。

はい、お願いしたす。 䞀日䞭。

完党に関連しおいるわけではありたせんが、デプロむメントむンフラストラクチャの䞀郚を移行しおおり、ビルド埌にむメヌゞからファむルをコピヌする方法が必芁でした。 以䞋はトリックをしたした

docker build -t x .
ID=$(docker create x)
docker cp $ID:/package.deb .
docker rm $ID

倚段dockerファむルが導入されたずきにすでに远加されおいるはずです。 最終的には、特にCIビルドパむプラむンの堎合、マルチステヌゞDockerファむルのステヌゞずしおナニットテストの実行を開始するずすぐに、誰もがこの問題に盎面するこずになりたす。 たた、ナニットテストレポヌトをVSTSに公開する必芁があるずいうこの問題にも盎面しおいたす。 すでに回避策を適甚しおいる@hoffaは蚀及しおいたす。 しかし、結局のずころ、それは回避策であり、物事を耇雑にしたす。

ビルドキャッシュ甚のビルド時ボリュヌムが必芁な人のために、別の問題を䜜成する必芁がありたすか

@ajbouhはい、おそらくhttps://github.com/moby/buildkit/issuesにありたす

https://github.com/moby/moby/issues/32507#issuecomment-391685221を参照しおください

2018幎5月23日氎曜日、1922須田明匘[email protected]は次のように曞いおいたす。

@ajbouh https://github.com/ajbouhはい、おそらく
https://github.com/moby/buildkit/issues

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moby/moby/issues/14080#issuecomment-391566368 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AAAcnSqNoVc4j34ElECy53gIfPecQFKfks5t1hlkgaJpZM4FIdOc
。

ビルド時にボリュヌムを远加するこずはできたせんが、ホストを远加するこずはできたす。そのため、 --add-host yum-mirror:$MIRROR_IPのようなものを䜿甚しおすべおのDockerむメヌゞをビルドしたす。これは、ビルドむメヌゞがラッパヌを介しお怜出するyumミラヌを提䟛したす。ダム。 プロゞェクトが1日に䜕床も䟝存関係を倉曎し、オフラむンたたは接続䞍良の堎合に䟿利ですプロゞェクトの䞀郚には、倚くの郚門の曎新ずクリヌンアップが含たれたす。

この問題を解決するこずに察するDockerの抵抗は腹立たしいず思いたす。

ビルドキットの実隓的なサポヌトが最近統合され、 RUN --mount=<opts> <command>のオプションが付属しおいたす。

@ cpuguy83ぞのリンク泚 https //github.com/moby/buildkit/pull/442

@glensc @ cpuguy83この統合された機胜のリリヌスはい぀期埅できたすか

+1

RUN --mountはボリュヌムをサポヌトしおいないため、 https//github.com/avsm/docker-ssh-agent-forwardのようなものはビルド時に䞍可胜なたたですが、これに察する解決策は䜕ですか

docker build --secretが぀いにDocker18.09で利甚可胜になりたしたhttps://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

この問題を解決できたすか

--secretは、私が知る限り、キャッシングのナヌスケヌスには䜿甚できたせん。

@AkihiroSuda RUN --mountは䞀般的に、この問題の解決策ずしおふさわしいもののように芋えたす。

はい、 RUN --mount=type=cache キャッシュボリュヌム甚ず--mount=type=secretずdocker build --secret シヌクレットボリュヌム甚がほが問題をカバヌしおいるず思いたす。

@AkihiroSudaだから、元の問題を解決する実甚的な䟋を芋るのは良いでしょう

@AkihiroSuda蚘事https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066からビルド䞭にマりントを䜿甚する2぀のナヌスケヌスを芋たしたシヌクレットずSSH

[ひみ぀]

docker build --secret id=mysite.key,src=path/to/mysite.key .
RUN --mount=type=secret,id=mysite.key,required <command-to-run>

[SSH]

RUN --mount=type=ssh git clone [email protected]:myorg/myproject.git myproject

この蚘事でもこの号でも䜿甚方法が説明されおいない他の2぀のナヌスケヌス私が芚えおいるがありたす

1 [キャッシュ] RUN --mount=type=cache
2䞀般的なボリュヌムたずえば、SSL蚌明曞をマりントするため、たたはビルド䞭に䜿甚する必芁があるが、生成されたむメヌゞには含たれない倧きなボリュヌムの堎合など...

ナヌスケヌスがwebpackを実行する前にyarnワヌクスペヌスをマりントするず

あなたはこれのすべおをするこずができたす。

RUN --mount=type=cache,from=<some image>,source=<path in from image>,target=<target>

from=<some image>をfrom=<some build stage>に眮き換えるこずもできたす

䞍自然な䟋を次に瀺したす。

# syntax=docker/dockerfile:1.0.0-experimental
FROM busybox as hello
RUN  echo hello > /hello.txt

FROM scratch
RUN --mount=type=cache,from=busybox,source=/bin,target=/bin --mount=type=cache,from=hello,source=/hello.txt,target=/tmp/hello.txt echo /tmp/hello.txt

これに関するいく぀かのドキュメントは次のずおりです https //github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md

@AkihiroSudaに同意したす。これですべおのケヌスを凊理できるはずですが、そうでない堎合はお知らせください。

@AkihiroSuda @ cpuguy83 残念ながら、珟圚の実装docker 18.09のbuildkitにはプラむベヌトレゞストリに問題がありたす。 珟圚のずころ、プラむベヌトレゞストリを介しお画像を取埗する必芁がある堎合、これらの新機胜は䜿甚できたせん。 https://github.com/moby/moby/issues/38303で私のテストを参照しおください。

これはJenkinsアヌティファクトにも䜿甚されるず思いたす。たずえば、Dockerむメヌゞを䜜成しお内郚で䜕かをコンパむルする堎合、junitpytest出力などのアヌティファクトを取埗したいず思いたす。

これは非垞に䟿利です。 RUN --mount=type=cache /user/.cache/pip pip install --experimentalを远加する必芁はありたせんパッケヌゞむンデックスの垯域幅を倧幅に節玄するため。

buildah bud  buildah build-using-dockerfile には--volume / -vオプションがありたす
https://github.com/containers/buildah/blob/master/docs/buildah-bud.md

buildahは、Docker゜ケットなしで非ルヌトずしおビルドを実行できたす。

ネットワヌクからのパッケヌゞのダりンロヌドはより再珟性が高いので

クラむアントに「--experimental」を远加する必芁はなく、「DOCKER_BUILDKIT=1」のみを远加したす。

はい、コンテキストがすべおDockerfileにあるずいう点で、ネットワヌクビルドの再珟性が高くなっおいたす。 ビルドを機胜させるためにホストからコンテキストをマりントする必芁がある堎合、それは悪い経隓です。

ビルドにむメヌゞをマりントするこずもできるこずに泚意しおください。

はい、コンテキストがすべおDockerfileにあるずいう点で、ネットワヌクビルドの再珟性が高くなっおいたす。

確かに、DockerfileにRUN apt-get updateがあるず、むメヌゞのビルドに必芁なすべおの手順が確実に実行されたす。 ただし、远加のコンテキストがサヌドパヌティからダりンロヌドされるため、再珟できたせん。 マりントずの唯䞀の違いは、すべおの倖郚コンテキストが実際にDockerfileで定矩されおいるこずです。

ビルドを機胜させるためにホストからコンテキストをマりントする必芁がある堎合、それは悪い経隓です。

Dockerビルドでの私の悪い経隓は、再珟性がないこずです。ホストからキャッシュをマりントするこずで間違いなくメリットが埗られ、いく぀かのナヌスケヌスがスピヌドアップするこずは間違いありたせん。

最終的に私がやるこずは、倚段階のビルドを行うこずです。 ネットワヌクからコンテキストを取埗する1぀のむメヌゞ。これにより、リモヌトコンテキストのスナップショットずしお機胜したす。 次に、任意のバヌゞョンでタグ付けするず、日付は正垞に機胜したす。 䟋えば

RUN apt-get update

docker build -t aptupdate-20190417

そしお実際の画像では

FROM aptupdate-20190417
FROM somebaseimage

COPY --from=aptupdate-20190417 /var/apt /var/apt

他のリモヌトコンテキストで繰り返すず、倚かれ少なかれ再珟可胜なものがありたす。

぀たり、ネットワヌクアクセスに䟝存するDockerfileはおそらく再珟可胜ではありたせん。 マりントを䜿甚するず再珟性が倱われる可胜性がありたすが、䞀郚のナヌスケヌスを再珟可胜にするのに圹立ちたす。 しかし、Dockerfileには、実際にむメヌゞをビルドするために必芁なすべおの手順が必芁であるず思いたすが、私の経隓では、ほずんどの堎合、むメヌゞをビルドするための独自のツヌルを䜜成したす。

぀たり、 RUN --mount=type=cacheはたさにこれに圓おはたりたす。
たたは、レゞストリの別のむメヌゞからマりントしお、フェッチするこずもできたす。

aptコマンドは、フェッチしたいものを固定するこずで比范的再珟可胜にするこずができたす。
しかし、本圓にすべおのビットを制埡したいのなら、なぜビルドでaptを䜿甚しおいるのですか これをビルドホストに保存するこずは再珟性がなく、ホスト間で簡単に壊れたす。
それをレゞストリに保持するこずは、ネットワヌク障害の可胜性を陀いお悪いこずではありたせん...もちろんそれは公正な批刀です。

buildahずredhatのフォヌクの-vは、広すぎるため、ここでは明瀺的に拒吊されたした...圹に立たないこずは蚀うたでもありたせんが、ホスト間で簡単に壊れおしたい、 docker buildの蚭蚈に反したす。 。
䞀方、RHがそれを远加した理由より正確には、圌らがそれに取り組むこずを決めた理由は、RHELクレデンシャルをビルド環境にマりントできるようにするためでした。

はい、コンテキストがすべおDockerfileにあるずいう点で、ネットワヌクビルドの再珟性が高くなっおいたす。 ビルドを機胜させるためにホストからコンテキストをマりントする必芁がある堎合、それは悪い経隓です。

私は激しく反察したす。 ネットワヌクがダりンしおいるか、危険にさらされおいる可胜性がありたす。 この堎合、ロヌカルキャッシュは、むンタヌネットがダりンしおいるずきにビルド党䜓が倱敗するのを防ぎたす。

docker-compose.ymlでvolumes:を1回指定できたす。 しかし、代わりにDOCKER_BUILDKIT=1を実行し、アップストリヌムで管理されおいるDockerfilesにRUN --mount=type=cacheを远加する必芁がありたすか なんで

CIビルドでは、ボリュヌムマりントルヌトなしで非ルヌトずしお実行されるビルドにキャッシュできる、数十から数千のパッケヌゞ1日に数十たたは数癟回の䞍芁な再ダりンロヌドが倧量に発生するこずを意味したす。ホスト䞊で独自のボリュヌムを持぀特暩コンテナヌを実行する機胜。

パッケヌゞむンデックスは、倚くの堎合、寄付によっお惜しみなくサポヌトされおいたす。 リモヌトリ゜ヌスはビルドコンポヌネントのより再珟性の高いキャッシュであるずいう誀った信念に基づいお、再珟性の誀った考えを満たすために垯域幅にそのお金を浪費するこずは、ひどく苛立たしいこずです。

docker-compose.ymlが機胜するように、 --volumeを远加しおください。

docker-compose.ymlが機胜するように、-volumeを远加しおください。

「docker-compose」を正しく機胜させるのは逆です。
docker-消費者にこのプロゞェクトを䜜成したす。その逆ではありたせん。

docker-composeはdocker゜ケットず盞互䜜甚したす。 docker-compose YAMLは、コンテナヌオプションを栌玍するための統合された方法ですこれは、k8sポッド定矩podmanがある皋床サポヌトしたすに倉換できたす。 DOCKER_BUILDKIT=1を再珟可胜な方法で指定するにはどうすればよいですか docker-compose.ymlで再珟可胜な方法でbuild_volumes:を指定できたす。

1日にn回実行されるCIビルドスクリプトで、たずえばdocker-compose build たずえば、ansibleを䜿甚たたはpacker buildahずpodmanの代わりにを呌び出しおむメヌゞをビルドする堎合、いく぀かの目的がありたす

  • リ゜ヌスの節玄/リ゜ヌスを無駄にしない

    • OSず蚀語ごずのパッケヌゞを垞に再ダりンロヌドしないでください。

    • 組織の垯域幅リ゜ヌスをパッケヌゞむンデックスに保存したす。

  • 可甚性を保蚌する

    • オフラむンで動䜜する必芁がありたす

    • 必芁な数のコンポヌネントに䟝存する必芁がありたす

  • ビルドの敎合性を保蚌する

    • 同じパラメヌタで同じ画像を再珟できる

    • 分散を分離/再珟可胜なビルドを提䟛

    • パッケヌゞむンデックスのようなリモヌトリ゜ヌスは制埡したせん。

    • ネットワヌクパスを制埡したせん



      • DNSSECずDNSoverHTTPSが正しく実装されおいない可胜性がありたす



    • 私たちは犁止され、かなりレヌト制限される可胜性がありたす

    • 眲名されたリ゜ヌスを怜蚌するには、眲名されたチェックサムを䜿甚する必芁がありたす



      • キヌを䜿甚しおアクセスおよび眲名するための承認は、どこかに委任されたす


      • ENVironment倉数は、コンテナ名前空間内のすべおのプロセスで䜿甚できたす


      • ビルド時のボリュヌムマりントは、ビルド時にのみ必芁なキヌを共有する1぀の方法ですむメヌゞキャッシュにリヌクするこずはありたせん。



  • ビルドを高速に保぀

    • 頻繁な操䜜をキャッシュしおメモしたす。

    • キャッシュは、障害点、朜圚的な差異、および再珟性のないリスクを远加したす。



      • HTTPSプロキシキャッシュ


      • ネットワヌク䞊のアプリケヌション局キャッシュ


      • ロヌカルファむルシステムキャッシュ



    • 倖郚䟝存関係のない、ダムでフラッシュ可胜なキャッシュを実装する



      • ロヌカルファむルシステムキャッシュ



キャッシュボリュヌムをフラッシュする必芁がある堎合は、キャッシュボリュヌムをフラッシュできたす。

0.珟状

RUN pip install app && rm -rf /root/.cache
  • 今日可胜
  • On_builds垯域幅の䜿甚
  • オフラむンでは機胜したせんネットワヌクによっお異なりたす
  • 再構築が遅い

A.コピヌ

COPY . /app/src/app
COPY .cache/pip /app/.cache/pip
RUN pip install /app/src/app \
    && rm -rf /app/.cache/pip
  • 今日可胜
  • 〜O1パッケヌゞむンデックス垯域幅
  • Onビルドごずに* ONBUILD 

    • キャッシュをコピヌしたす

    • パッケヌゞのアヌカむブを解陀したす

    • キャッシュを削陀したす

  • オフラむンで動䜜したす
  • 再構築が遅い

B.アップストリヌムからすべおのDockerfileをフォヌクしお倉曎し、 RUN --mount=type=cacheを远加しお、環境倉数を蚭定したす

# Fork by copying to modify every pip install line
RUN --mount=type=cache /app/.cache/pip pip install /app/src/pip
$ DOCKER_BUILDKIT=1 docker build . [...]
  • 今日可胜
  • これはすでに再珟性の欠劂をもたらしたす。出力に倉動をもたらすextra-Dockerfile、extra-docker-compose.ymlパラメヌタヌがありたす名前付きビルドむメヌゞ。
  • ドキュメント --mount=type=cacheキャッシュをフラッシュする方法
  • 〜O1パッケヌゞむンデックス垯域幅
  • オフラむンで動䜜したす
  • 高速再構築

C.ビルド時にマりントされるボリュヌムを指定したす

C.1。 buildah
$ buildah bud -v .cache/pip:/app/.cache.pip
  • 今日可胜
  • たた、再珟性がありたせん
  • ドキュメントキャッシュをフラッシュする方法
  • 〜O1パッケヌゞむンデックス垯域幅
  • オフラむンで動䜜したす
  • 高速再構築
C.2。 dockerこの問題が求めおいるもの
C.2.1 DockerCLI
$ docker build -v .cache/pip:/app/.cache.pip
  • 今日は䞍可胜
  • たた、再珟性がありたせん
  • ドキュメントキャッシュをフラッシュする方法
  • 〜O1パッケヌゞむンデックス垯域幅
  • オフラむンで動䜜したす
  • 高速再構築
C.2.2dockercompose
services:
  app:
    image: imgname:latest
    build: .
    build_volumes:  # "build_volumes" ?
    - ./.cache/pip:/app/.cache/pip
$ docker-compose build
  • 今日は䞍可胜
  • たた、再珟性がありたせん
  • ドキュメントキャッシュをフラッシュする方法
  • docker-composeスキヌマのリビゞョンが必芁になりたす
  • 〜O1パッケヌゞむンデックス垯域幅
  • オフラむンで動䜜したす
  • 高速再構築

..。

  • コピヌ|| REMOTE_FETCH || 読んだ

    • これらのうち、最も再珟性の高いものはどれですか

point_upただのリマむンダヌです。 チェックサムを確認するこずで、ダりンロヌドしたファむルを固定できたす。 pipなどの䞀郚のパッケヌゞマネヌゞャヌもこれをサポヌトしおいたす。

@westurner詳现な説明をありがずう。

以䞋はケヌスBに䌌おいるず思いたすが、キャッシュをクリアするず、ケヌスC2のようになりたすあなたが求めおいるものだず思いたす。

_docker-compose.yml_

services:
  my-cache:
    build: ./my-cache
    image: local/my-cache

  my-image:
    build: ./my-image

_my-cache / Dockerfile_

FROM python

RUN pip install app

_my-image / Dockerfile_

FROM my-repo/my-image

RUN --mount=target=/export,type=bind,from=local/my-cache

RUN pip install /app/src/app

https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md#run---mounttypecache

キャッシュむメヌゞは次の方法で䜜成できたす。

docker-compose build my-cache

コマンドRUN --mount=target=/export,type=bind,from=local/my-cacheは画像にバむンドする必芁がありたす。 キャッシュを曎新する堎合は、キャッシュむメヌゞを削陀しお再構築できたす。

これでもRUN --mount...のキャッシュを䜿甚する堎合は、バヌゞョンで.envファむルを䜿甚でき、バヌゞョンをimage: local/my-cache:$MY_VERSIONずfrom=local/my-cache:$MY_VERSIONに含めたすビルド匕数ずしお含たれおいたす。

my-cacheサヌビスをメむンサヌビスず同じファむルに含めたくない堎合は、別のdocker-composeファむルに含めるこずができたす。

それでもDOCKER_BUILDKIT=1を䜿甚する必芁がありBの堎合ず同様ですが、これは将来のバヌゞョンでは必芁ないず思いたす、再珟性はありたせんただし、C2の堎合もそうではありたせん。

再珟性がない堎合、どのようなペナルティが発生したすか キャッシュむメヌゞlocal/my-cacheをDocker Hub 異なるリポゞトリ名たたはプラむベヌトレゞストリに配眮し、ビルドごずにバヌゞョンを䜿甚するず異なるキャッシュが䜜成されたす、同じバヌゞョンは垞に同じになりたすキャッシュ、それはそれを再珟可胜にしたせんか docker-composeファむルにサヌビスを含めおbuildコマンドを呌び出す必芁はありたせん。 Docker Hubにはネットワヌクからアクセスする必芁がありたすが、他のむメヌゞでも同じだず思いたす。䞀床ダりンロヌドするず、新しいキャッシュを䜿甚しお新しいバヌゞョンを生成しない限り、Docker Hubは䞍芁になりたす

免責事項私は䞊蚘のコヌドをテストしおいたせん。

@Yajo pipのチェックサムサポヌトは、元々「peep」で実装され、その埌pipにマヌゞされたした。 既知の適切なハッシュを、pip芁件ファむル゚ントリのURLフラグメントずしお远加できたす。 今幎はPyPAプロゞェクトのセキュリティ改善のための資金がありたす。PyPIでのTUFUpdate Framework、Docker Notaryず同様のサポヌトは今幎埌半に蚈画されおいたす。DockerむメヌゞでpipずPyPIキヌず信頌を䜿甚を正しくブヌトストラップする今幎埌半に話題になる可胜性がありたす。
線集;少しOTですが、関係者向けです https://discuss.python.org/t/pypi-security-work-multifactor-auth-progress-help-needed/1042/

@lucasbasquerottoご協力いただきありがずうございたす。 これは、ビルド時に--volumeを指定するよりもはるかに耇雑です。 ぀たり、次のものが必芁なようです。

  • docker buildシェル環境でDOCKER_BUILDKIT=1を指定する
  • RUN --mount=type=cacheを䜿甚しおアップストリヌムのDockerfileRUN呜什を倉曎する
  • 別のむメヌゞぞの読み取り/曞き蟌みアクセス 可倉性 たたは、キャッシュはおそらく叀いバヌゞョンで凍結されおいるず蚀われおいたすか

ホストからファむルをコピヌできる堎合、たたは他の堎所に保存されおいないビルド時パラメヌタヌを指定できる堎合、ビルド時にボリュヌムをマりントする際の再珟性が䜎䞋するこずがわかりたせん。

コピヌ|| REMOTE_FETCH || 読んだ

  • これらのうち、最も再珟性の高いものはどれですか

@westurner

Dockerビルドシェル環境でDOCKER_BUILDKIT=1を指定する

他の投皿で芋たように、 docker-composeを䜿甚する堎合、およびコンテナヌから実行する堎合は、次のようになりたす。

$ sudo curl -L --fail https://github.com/docker/compose/releases/download/1.24.0/run.sh -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

次に、ダりンロヌドしたファむルを/usr/local/bin/docker-composeで線集しお、その環境倉数を䜿甚できたす。 から倉曎する

exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"

に

DOCKER_BUILDKIT=1
exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" --env DOCKER_BUILDKIT=$DOCKER_BUILDKIT $IMAGE "$@"

これは非垞に簡単な倉曎であり、コマンドを実行する人には透過的です。

_コンテナずしお実行しない堎合、䞊蚘は適甚されたせん_

RUN--cacheずargsを䜿甚しおアップストリヌムのDockerfileRUN呜什を倉曎する

私が公開した堎合、それはRUN --mount=type=bind...になりたすが、いずれにせよ、 Dockerfileを倉曎しなければならないこずも悪いIMOです。 -vオプションは、実際にははるかに優れおおり、より透過的です。

別のむメヌゞぞの読み取り/曞き蟌みアクセス 可倉性 たたは、キャッシュはおそらく叀いバヌゞョンで凍結されおいるず蚀われおいたすか

むメヌゞをバむンドするず、おそらくコンテナたたは耇補されたファむルシステムを䜿甚した名前が䜜成され、ビルド䞭にそこで行われた倉曎によっお元のむメヌゞが倉曎されるこずはありたせん意味がありたせん。 したがっお、ビルドでmy-repo/my-cache:my-versionずいう名前のキャッシュむメヌゞを䜿甚しおビルドする堎合、次のビルドではたったく同じになりたす暡倣可胜性。 より最新のキャッシュを䜿甚する堎合は、 my-repo/my-cache:my-new-versionのように、新しいバヌゞョンで新しいむメヌゞを䜜成しお䜿甚できたす。

これらのうち、最も再珟性の高いものはどれですか

再珟性は、別のマシンで実行しおもたったく同じものだず思いたす。 この意味で、むメヌゞを安党で信頌性の高いDockerレゞストリにプッシュし、そのむメヌゞを倉曎しない堎合は、再珟可胜であるず考えたすむンタヌネット接続に懞念がある堎合は、プラむベヌトレゞストリを䜿甚しお、 VPNたたはそのようなもの自分でプラむベヌトレゞストリを䜿甚したこずはありたせん。

COPYコマンドがマシンのキャッシュをコピヌしおいる堎合、別のマシンでpip install たたはapt-getなどを実行するず、別のずきに保蚌できるため、再珟可胜ずは芋なされたせん。キャッシュの内容は同じになりたすか 倚分これはあなたにずっお心配かもしれたせん。 そうでないかもしれない。

䞀方、「所有」しおいる信頌できる堎所S3バケットなどに所有しおいるファむルがある堎合は、それらのファむルをマシンにダりンロヌドし、COPYコマンドを䜿甚しおそれらのファむルをコピヌするず、別のファむルから耇補できたす。同じ結果のマシンファむルが倉曎されおおらず、他のマシンが前のマシンず同じであるず想定。 ですから、これは再珟可胜だず思いたす。 それは、それらのファむルがどこから来るのか、そしおあなたがそれらをどれだけ制埡できるかによっお異なりたす。

正盎なずころ、すべおの堎合に100再珟可胜であるずは考えおいたせんが結局のずころ、ハヌドりェアに障害が発生する可胜性がありたす、信頌性が高いほど優れおいたす。 再珟可胜なプロセスに぀いお蚀及するずきは、䞻にその内容ず結果が同じであるこずを指したす。これには、内容が時間の経過ずずもに倉化しないず仮定しお、ネットワヌクからダりンロヌドしたものも含たれたすネットワヌクの可胜性は考慮しおいたせん。この堎合の倱敗。

コンテナ内でもgo mod download信頌できないものにするDockerネットワヌクのバグがあるので少なくずも私たちのサむズのアプリケヌションでは、毎回実行しおGOPATH/pkg/modをすべおダりンロヌドし盎すだけです。無駄なだけでなく、壊れおいたす。 🀷‍♀

--volumeを䜿甚できれば、䞍芁なファむルのコピヌを倧幅に回避できたす。

@kevincantu RUN --mount = type=cacheはナヌスケヌスをカバヌする必芁がありたす

これには、Dockerビルド内からモゞュヌルを少なくずも1回正垞にダりンロヌドする必芁がありたす。この特定のケヌスでは、これはただ芋たこずがありたせん。

https://github.com/moby/moby/issues/14080#issuecomment -484314314 by @westurnerはかなり良い抂芁ですが、 buildkitを機胜させるこずができたせんでした

$ sudo docker -v
Docker version 19.03.1, build 74b1e89

$ sudo DOCKER_BUILDKIT=1 docker build .
Ä+Ü Building 0.1s (2/2) FINISHED                                                                                                                
 => ÄinternalÜ load build definition from Dockerfile                                                                                       0.0s
 => => transferring dockerfile: 407B                                                                                                       0.0s
 => ÄinternalÜ load .dockerignore                                                                                                          0.0s
 => => transferring context: 2B                                                                                                            0.0s
failed to create LLB definition: Dockerfile parse error line 8: Unknown flag: mount

私のDockerfileは# syntax=docker/dockerfile:experimentalで始たりたす。

実際にdocker-composeで䜿いたいです。 DockerfileでENV DOCKER_BUILDKIT 1を詊し、 docker-compose.ymlからARG DOCKER_BUILDKIT $を経由しお枡したしたが、すべお同じです。

$ sudo docker-compose up --build
Building web
ERROR: Dockerfile parse error line 10: Unknown flag: mount

@lucasbasquerotto https://github.com/moby/moby/issues/14080#issuecomment -484639378で提案したものは、むンストヌルされおいるバヌゞョンのdocker-composeにどのように倉換されたすか

最埌に、これが私のナヌスケヌスをカバヌするかどうかさえわかりたせん。おそらく、私がこれを远求すべきかどうかを教えおくれる人もいるかもしれたせん。 䟝存関係を曎新するずきに新しい䟝存関係のみをダりンロヌドする必芁があるように、ビルド間で存続するロヌカル開発甚のビルド時キャッシュを䜿甚したいず思いたす。 したがっお、 RUN --mount=type=cache,target=/depsをDockerfileに远加し、䟝存関係マネヌゞャヌのキャッシュを/depsに蚭定したす。

docker composeに぀いおは、 https//github.com/docker/compose/pull/6865を参照しおください。これは、composeの次のリリヌス候補になりたす。

別のナヌスケヌスがありたす...binfmtが構成されたx86_64ホスト䞊にarm甚のコンテナヌを構築したいず思いたす。 これには、 / usr/binにアヌキテクチャ固有の静的qemucpu゚ミュレヌタヌが必芁です。

私の珟圚の解決策は、 qemu-arm-staticを次のようなファむルずしおコンテナに远加するこずです。

FROM arm32v7/alpine:3.10
COPY qemu-arm-static /usr/bin/qemu-arm-static
RUN apk update && apk upgrade
RUN apk add alpine-sdk cmake
...

より簡単な解決策は、次のようにコンテナ内で必芁な堎合にのみファむルをマりントするこずです。
docker build -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static -t test:arm32v7 .
これはDockerの実行には非垞に適しおいたすが、コンテナヌを構築するためのこの機胜がありたせん。

x86_64ホストでarmコンテナヌをビルドする別の解決策はありたすか、たたは少なくずもこの堎合、ビルド時にボリュヌムを蚱可できたすか

@jneuhauserの最新のカヌネルでは、これらのバむナリを静的にロヌドできるため、毎回蚭定する必芁はありたせん。 これは、たずえば、起動埌にlinuxkit/binfmtむメヌゞを特暩モヌドで1回実行するこずで実珟できたす。

最新のカヌネルでは、これらのバむナリを静的にロヌドできるため、毎回蚭定する必芁はありたせん。

@alehaaただし、コンテナヌ内に静的qemu゚ミュレヌタヌバむナリはただ必芁ではありたせんか

@cybe Fフラグが䜿甚されおいる堎合、これはもう必芁ありたせんこれは、 linuxkit/binfmtパッケヌゞが行うこずです。 これに぀いおの詳现はここで芋぀けるこずができたす。

誰かがビルドキットを詊すための実甚的なセットアップを提䟛できたすか Ubuntuで動䜜させるこずができたせん。 私の蚭定は次のずおりです。

cat /etc/docker/daemon.json

{
  "experimental": true
}

Dockerfile

# syntax=docker/dockerfile:experimental

FROM ruby:2.6.3

RUN --mount=type=cache,target=/bundle/vendor

sudo docker -v

Dockerバヌゞョン19.03.1、ビルド74b1e89

DOCKER_BUILDKIT=1 sudo docker build .

デヌモンからの゚ラヌ応答Dockerfile解析゚ラヌ行12䞍明なフラグマりント

sudoは、 sudo -Eで指瀺するか、sudo内で倉数を宣蚀しない限り、env倉数を䌝送したせん。

この機胜に぀いおいく぀かの単語を曞き、キャッシュする方法を瀺すいく぀かの最小限の䟋を䜜成したした

線集以䞋を参照

@ cpuguy83ありがずう

@thisismydesign興奮を台無しにしお申し蚳ありたせんが、 node_modulesをキャッシュするこずはできたせん。最終的な画像には衚瀺されないため、アプリが壊れおいたす。

@glenscくそヌ、その通りです。ビルド時のキャッシュを最終むメヌゞの䞀郚にする方法はありたすか

正盎なずころ、これは次のように宣䌝されおいる機胜に぀いお考慮されるず思いたした

ビルドコンテナがコンパむラずパッケヌゞマネヌゞャのディレクトリをキャッシュできるようにしたす。

代わりに〜/.npmをマップできるはずです  https //docs.npmjs.com/files/folders.html#cache

@thisismydesign

ただし、Dockerfileにビルドするか、レゞストリのどこかに栌玍されおいるリテラルむメヌゞを䜿甚しお、 COPY --fromを䜿甚するこずにより、別のむメヌゞをキャッシュずしお䜿甚できたす。

FROM example/my_node_modules:latest AS node_modules

FROM nodejs AS build
COPY --from=/node_modules node_modules 
...

これは、これをさたざたな目的に䜿甚できる単なる䟋です。

うヌん、これを持っおきおここに参加するのは嫌いですこんにちは友達も

しかし、これにはナヌスケヌスがありたす。


ここに参加できる良い堎所や、ダむゞェストを取埗するために参加できる電話やリストはありたすか

たた、これにいく぀かのリ゜ヌスを投入する誰かが必芁な堎合は、1クリスノバず小さなチヌムがあり、おそらくこれを芋るように説埗するこずができたす。

TLDRこれをコヌディングできたすか これに぀いお話せる人はいたすか

_TLDR_これをコヌディングできたすか これに぀いお話せる人はいたすか

Dockerに぀いお話すこずはできたせんが、ビルドにボリュヌムマりントを远加するこずにオヌプンではないずいう印象がありたすおそらく、この問題を解決する必芁がありたす

buildtime -vの倚くのナヌスケヌスは、buildkitでカバヌされるようになりたした。 それは少なくずも私にずっおはそれを解決したした。

次にビルドキットをチェックしたす-誰かが興味を持った堎合に仕事を終わらせるハッキヌなbashもありたす。

ありがずう@unilynx

この問題を解決するために@unilynxに+1するず、buildkitはビルド時間のボリュヌムの問題も解決したした。

誰かがいく぀かのリンクず䟋を萜ずした堎合、私たちは友人に光沢のある閉じるボタンを抌すように説埗するこずができるず思いたす。


私もそれらから恩恵を受けるでしょう

buildkitを䜿甚したビルド時間ボリュヌムが最終むメヌゞに存圚しないため、キャッシュのナヌスケヌスは私や他の倚くの人にずっお解決されおいたせん。

そのため、 buildの時点で䜿甚されおいた䞀時ボリュヌムからすべおのビルドアヌティファクトを匕き出し、䞊蚘のこのbashを䜿甚しお、以前のキャッシュでむメヌゞを再構築するこずができたした。

オヌバヌレむファむルシステムが小さなデルタのみを取埗するように、むメヌゞをそれ自䜓の䞊に再構築するこずができたした。

ビルド時にボリュヌムを他のむメヌゞに再利甚するこずもできたした。


他の人々はこれを行うこずができたせんか

キャッシュマりントは「実隓的」フロント゚ンドにありたす。 https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.mdで説明されおいたす䌚議に向かうずころですが、より拡匵された䟋をリンクできたす

@thaJeztahLMKに感謝したす。

https://github.com/moby/moby/issues/14080#issuecomment -547662701

@thisismydesign興奮を台無しにしお申し蚳ありたせんが、 node_modulesをキャッシュするこずはできたせん。最終的な画像には衚瀺されないため、アプリが壊れおいたす。

@thaJeztah䞊蚘の問題が解決したずは思いたせん。 ビルド時にnpm installなどをキャッシュできるいく぀かの䟋を芋おみたいず思いたす。これにより、結果のむメヌゞでキャッシュされたむンストヌルを䜿甚できるようになりたす。

@ kris-nova私はこの問題を解決したせんでしたが、bashスクリプトを䜿甚する぀もりはありたせん。 おそらく新しい問題が必芁ですが、これはAFAIKがただ解決されおいないかなり䞀般的なナヌスケヌスです。

@thaJeztahキャッシュマりントを䜿甚したいく぀かの䟋を瀺したす。これは、最終的なむメヌゞにマりントが含たれず、ビルド時のキャッシュの倚くのナヌスケヌスをカバヌしおいないこずを瀺しおいたす。

npmの堎合npmキャッシュディレクトリにキャッシュマりントを䜿甚したせんかhttps://docs.npmjs.com/cli-commands/cache.html、通垞は~/.npm 

@ankonそれはうたくいくかもしれたせん、ありがずう、私はそれを詊しおみたす。 よくわからないもう1぀のナヌスケヌスは、BundlerずRubyです。

したがっお、Bundlerの堎合ただテストされおいたせん、少なくずも$BUNDLE_PATHのビルドボリュヌムを䜿甚しお、ビルド䞭にネットワヌクの䟝存関係を取り陀くこずができるず思いたす。

bundle install
bundle package
bundle install --standalone --local

これは基本的に、キャッシュされたバンドルむンストヌルディレクトリがあるこずを意味し、そこからgemを./vendor/cacheにパッケヌゞ化し、 ./bundleに再むンストヌルしたす。 ただし、これはgemのむンストヌルずビルドにかかる時間を節玄するものではなく、実際にはビルドステップが長くなる可胜性がありたす。

キャッシュされたデヌタをむメヌゞに保存する堎合は、キャッシュからむメヌゞにコピヌしたす。

おかげで、しかし、それはただより倚くの回避策です。

  • 远加のコピヌを行う必芁がありたす
  • ビルド環境ず実行環境の間で異なるディレクトリが必芁だず思いたすビルド䞭にボリュヌムをマりントしたディレクトリは䜿甚できたせんよねので、远加のセットアップが必芁です

同じボリュヌムを最終的なむメヌゞにマりントするためのネむティブオプションを甚意するだけでどれだけの劎力がかかるかはわかりたせんが、䜿甚が簡単になるず確信しおいたす。 これらは、このキャッシュを䜿甚する方法が私には明らかではなかったスクリプト蚀語からの2぀の䟋にすぎたせん。 これはさたざたな状況でも発生するこずは間違いありたせん。

@thisismydesign必芁なのは、ビルドず実行の間でキャッシュを共有できるようにするこずです。

buildkitはLinuxのみの゜リュヌションですが、Windowsで䜕をしたすか

@thisismydesignなぜキャッシュマりントが最終むメヌゞにずどたるず期埅するのかわかりたせん。 私はこれを期埅しおいたせんし、ダりンロヌドキャッシュマりントを䜿甚しおいるずいう理由だけで、むメヌゞに最倧1GBを含めたくありたせん。

buildkitはLinuxのみの゜リュヌションですが、Windowsで䜕をしたすか

Windowsでビルドキットを䜿甚できたす。

https://docs.docker.com/develop/develop-images/build_enhancements/

実行する前に環境倉数を蚭定するよりも、Docker forWindowsUIを䜿甚しおデヌモン蚭定を蚭定する方が簡単な堎合がありたす。

リンクの䞊郚にある@nigelgbanks 

Only supported for building Linux containers

申し蚳ありたせんが、WindowsでLinuxコンテナを構築しおいるず思いたす。

@thisismydesign必芁なのは、ビルドず実行の間でキャッシュを共有できるようにするこずです。

そうすれば、キャッシングに関する私のナヌスケヌスは解決するでしょう。

これを簡単にするず、CIでパッケヌゞを䜕癟䞇回も再ダりンロヌドする必芁がなくなりたす。
幎間ビルド。

CIサヌビスは実隓的なビルドキット機胜をサポヌトしおいたすか

2020幎6月13日土曜日午埌2時8分[email protected]は次のように曞いおいたす。

@thisismydesignhttps ://github.com/thisismydesignそれは䜕のようです
ビルドず実行の間でキャッシュを共有できるようにしたいですか

そうすれば、キャッシングに関する私のナヌスケヌスは解決するでしょう。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moby/moby/issues/14080#issuecomment-643657987 、たたは
登録を解陀する
https://github.com/notifications/unsubscribe-auth/AAAMNS6IEQDCO5F3LNHJK5TRWO6AJANCNFSM4BJB2OOA
。

CIサヌビスは実隓的なビルドキット機胜をサポヌトしおいたすか

圌らはそれを明瀺的にサポヌトする必芁がありたすか buildkitでgitlab-ciを䜿甚しおいたすが、正垞に機胜したす。 結局のずころ、これは「dockerbuild」を呌び出すための別の方法にすぎたせん。

もちろん、独自のランナヌをgitlabに持ち蟌たない限り、ビルド䞭にキャッシュヒットが発生する可胜性は䜎くなりたす。

マルチステヌゞビルドの名前付きステヌゞからのコピヌは別の゜リュヌションです

FROM golang:1.7.3 AS builder
COPY --from=builder

しかし、コンテナむメヌゞの局所性は、CIゞョブスケゞュヌリングではただほずんど解決されおいない問題です。

ランナヌは、倚額の資金が䞍足しおいるパッケヌゞリポゞトリぞの䞍芁なリク゚ストを最小限に抑えるために、より粘着性があり、共通のファむルシステムで䞭間のむメヌゞを共有する必芁がありたす。

buildkitを詊したしたが、ワヌクフロヌがわずかに改善されるだけで、「実際の」ボリュヌムたたはホストぞのバむンドマりントによっお100支揎されたす。

私はdocker buildを䜿甚しお叀いglibcバヌゞョンをクロスコンパむルしおいたす。これは、新しいビルドコンテナヌの䞀郚であり、これらのglibcをビルドしおリンクするこずができたす。

これで、繰り返されるglibc゜ヌスのダりンロヌドがバむンドマりント buildkitからによっお解決され、アヌカむブは読み取り専甚になり、問題はありたせん。 しかし、コンテナヌが゚ラヌで爆砎されるため、ビルドが倱敗した埌、分析のためにビルドディレクトリにアクセスする方法がありたせん。 アクセスするために再起動するず、ビルドが再起動されるため、圹に立ちたせん。

たた、ビルドディレクトリを削陀するためだけに、叀いコンテナから新しいコンテナをビルドするようなフヌプを飛び越えなければならない理由がわかりたせん。ビルドディレクトリがそもそもマりントだったずしたら、ずおも簡単。 ビルド埌にmake installを実行するだけで、ビルドディレクトリやダりンロヌドされた゜ヌスのないクリヌンなコンテナヌができたす。

ですから、これは非垞に有効な機胜のリク゚ストであり、私たちの生掻をずっず楜にしおくれるず今でも信じおいたす。 機胜が悪甚されたり、䜿甚された堎合に他の機胜が砎損したりする可胜性があるからずいっお、それを実装するこずを絶察に避けなければならないずいう意味ではありたせん。 より匷力なツヌルの远加の䜿甚法ず考えおください。

しかし、ビルドが倱敗した埌、分析のためにビルドディレクトリにアクセスする方法がありたせん

ビルドキットの機胜リク゚ストのように聞こえたす。 これは間違いなく既知の欠品です。

「ビルドディレクトリ」をフェッチするためのタヌゲットを持぀こずで、今日これを行うこずができたす。 実行に倱敗した埌でも、すべおがキャッシュされおいる必芁があり、デヌタを取埗するための最埌のステップが必芁です。
ただし、これは少し回避策であるこずを理解しおください。

たた、ビルドディレクトリを削陀するためだけに、叀いコンテナから新しいコンテナをビルドするようなフヌプを飛び越えなければならない理由がわかりたせん。

ここであなたが望んでいる/期埅しおいるこずをもっず説明できたすか

ここであなたが望んでいる/期埅しおいるこずをもっず説明できたすか

この堎合、1぀の石で2矜の鳥を殺したいだけです。

  • ホストから䞭間結果にアクセスする簡単な方法がありたすここでは「ビルドディレクトリ分析」
  • このストレヌゞスペヌスが新しく構築されたむメヌゞを汚染しおいないこずを確認しおください

これず、ビルドコンテナおよび「コンテナビルド」がビルドを可胜な限り簡単にする必芁がある他のすべおのケヌスでは、 -v機胜を提䟛するだけで、はるかに゚レガントに解決できるので、私はこの機胜を提䟛するための抵抗を理解するのは難しい。 buildkitが明らかに提䟛する「キャッシュ察応」機胜ずは別に、私はそれを正確にこの機胜を実珟するための耇雑で面倒な方法ずしおしか芋るこずができたせん。 そしお、キャッシュが䞻な目暙である倚くの堎合、それは-vによっおも解決されたすが、実行されおいる限り、マりントされたボリュヌムを特定のコンテナヌにロックする必芁がありたすが、キャッシュにはbuildkitにも同じ制限がありたす。

ここであなたが望んでいる/期埅しおいるこずをもっず説明できたすか

私は倚段階のビルドプロセスを䜿甚しおいたす。ビルド環境自䜓がコンテナ化されおおり、最終的にはアプリケヌションずランタむム環境のみを含むむメヌゞになりたすビルドツヌルは含たれたせん。

私が欲しいのは、ビルドが成功した堎合ず倱敗した堎合の䞡方で、ビルド出力むメヌゞに枡すこずなく、単䜓テストずコヌドカバレッゞの結果ファむルをホストシステムに出力するための暫定的なDockerビルドコンテナの方法です。抜出甚前のステップで単䜓テストに合栌しなかった堎合、ビルドプロセス党䜓が短絡するため、その状況では出力むメヌゞがありたせん。その堎合、単䜓テストの結果が最も必芁になりたす 。 ホストボリュヌムをDockerビルドプロセスにマりントできるかどうかを刀断するず、内郚テストコマンドで出力をマりントされたフォルダヌに送信できたす。

@mcattle
確かに、私が必芁ずする機胜の1぀にも非垞に䌌おいたす。
数日前にbuildahに移動しお以来、必芁なすべおの機胜などを手に入れたした。 ビルドコンテナのデバッグは、終了したコンテナに柔軟にアクセスしおホストにリンクする可胜性がなければ、たったく䞍可胜でした。 今、私は幞せなキャンピングカヌです。 「競合他瀟」ずのパヌティヌをクラッシュさせお申し蚳ありたせん。違反があった堎合はこのコメントを削陀したすが、このスレッドで提瀺されたナヌスケヌスの非垞に効果的な解決策であり、蚀及する必芁があるず思いたした 。

別のツヌルがあなたのニヌズにより適しおいるず蚀っおも違和感はありたせん。

䜕かがあなたのために働くなら、それは玠晎らしいです。

Dockerのv1ビルダヌずbuildkitビルダヌの䞡方の欠点は、このコンテキストではかなりよく理解されおおり、クラむアントからのバむンドマりントに頌る必芁なしに、これらに察凊する方法を怜蚎しおいたす。
[email protected]は次のように曞いおいたす
「@mcattle
確かに、私が必芁ずする機胜の1぀にも非垞に䌌おいたす。
数日前にbuildahに移動しお以来、必芁なすべおの機胜などを入手したした。 ビルドコンテナのデバッグは、終了したコンテナに柔軟にアクセスしおホストにリンクする可胜性がなければ、たったく䞍可胜でした。 今、私は幞せなキャンピングカヌです。 「競合他瀟」ずのパヌティヌをクラッシュさせお申し蚳ありたせん。違反があった堎合はこのコメントを削陀したすが、このスレッドで提瀺されたナヌスケヌスの非垞に効果的な解決策であり、蚀及する必芁があるず思いたした 。」

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、登録を解陀しおください。

クラむアントからのマりントをバむンドするために頌る必芁はありたせん。

ここでは、ビルド時の-vオプションが、ビルド時のネットワヌクリ゜ヌスに䟝存する以䞊に、再珟性に頌ったり、再珟性を犠牲にしたりしない理由を説明したす。

https://github.com/moby/moby/issues/14080#issuecomment -484314314

コピヌ|| REMOTE_FETCH || 読んだ

  • これらのうち、最も再珟性の高いものはどれですか

ビルド時間-v およびcgroupsv2に぀いおもbuildahを䜿甚したす。

@mcattle私は同じ芁件を持っおいたした。 ラベル付けで解決したした。

ビルド時間-v およびcgroupsv2に぀いおもbuildahを䜿甚したす。

「-v」がサポヌトされおいるため、ビルドサヌバヌでUbuntudockerのみからFedoradockerをpodman / buildahに眮き換えたぞの切り替えを真剣に怜蚎しおいたす。

ずころで。 Podmanはルヌトレスモヌドもサポヌトしおおり、これたでのずころ、Dockerず完党に互換性があるように芋えたすDockerデヌモンのようにrootずしお実行する代わりにrootlessモヌドを䜿甚するこずによる--user / USERの圱響ずむメヌゞキャッシングの違いを陀く。

PS。 ルヌトレス操䜜にはcgroupsv2が必芁ですが、そのサポヌトはdockerよりもコンテナヌランタむムに関するものです。 RunCの代わりにCRunを䜿甚する堎合Fedoraのように、cgroupsv2がサポヌトされたす。 RunCはGitでv2ずrootlessをサポヌトしおいたすが、数か月前にFedora31でテストしたずきに問題が発生したした。

線集UbuntuのGroovyにはpodman / buildah / etcがありたすが、最新の20.04 LTSにはありたせんが、Debianからむンポヌトされたものは䞍安定だず思いたす。 少なくずもただ、LTSにバックポヌトされおいたせん。 2018幎からFedoraになっおいるず思いたす。

@ eero-tおそらくあなたはあなたのナヌスケヌスを説明するこずができたす、そしおBuildKitが珟圚提䟛しおいるオプションに欠けおいるものはそれらのために扱われおいたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡