シンボリックリンクされたフォルダーを通常のフォルダーとして表示する方法


38

ドッキングする必要がある2つのDartアプリケーションがあります。これら2つのアプリは、共有ソースディレクトリを使用します。
Dockerは、コンテキストディレクトリ(project/app1)の外のフォルダーからファイルを追加できないため../sharedshared(内のシンボリックリンクprojects/app1)からファイルを追加することも、そこからファイルを追加することもできません。

とにかくDockerをtrickす方法を探しています。

私の簡略化されたプロジェクト構造

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Dockerfile1つ上のレベルに移動docker buildしてそこから実行できますが、同じディレクトリに2つのDockerfile(app1とapp2用)が必要です。

私の現在のアイデアprojects/app1/sharedは、シンボリックリンクであるという事実を何らかの形で隠すことができれば、この問題は解決されるということでした。projectsSambaを使用して共有し、他の場所に再マウントし、通常のフォルダーのようにシンボリックリンクを処理するようにSambaを構成できるかどうかを確認しましたが、これがサポートされているかどうかがわかりません(Sambaの経験があまりないので、まだ試していませんでした) 。

それを可能にする他のツールやトリックはありますか?

これは他のトラブルを引き起こし、ファイルをコピーしないため、ディレクトリ構造を変更したくないでしょう。

回答:


35

私はあまり経験dockerがないので、これが機能することを約束することはできませんが、1つの選択肢はディレクトリにリンクする代わりにマウントすることです

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

これはシステムにアタッチ../shared./sharedれ、システムに対して完全に透過的でなければなりません。で説明されているようにman mount

バインドがマウントされます。

Linux 2.4.0以降では、ファイル階層の一部を別の場所に再マウントできます。呼び出しは次のとおりです。

mount --bind olddir newdir

または、このfstabエントリを使用して:

/olddir /newdir none bind

この呼び出しの後、同じコンテンツに2つの場所でアクセスできます。


1
@zoechiこれは両方のサイトで完全に話題になっています。原則として、このような技術的な質問をU&Lに投稿し、ユーザースペースの質問をここに投稿します。選択は完全にあなた次第です。一方で、より多くのユーザーがここにいるので、より多くの眼球があり、他方では、U&Lにプロの* nixの人々がはるかに集中しています。両方のサイトに同じ質問を投稿しないようにしてください。移動する場合は、これを削除するか、MODの注意を引くためにフラグを立てて、移行するよう依頼してください。
テルドン14年

2
ドッカーデーモンを再起動する必要がありました。そうでない場合、マウントされたディレクトリはコンテナに表示されませんでした。
薄暗い

@dim yes!Capistranoで動作させようとしましたが、動作しませんでした– コンテナーを起動した、共有ディレクトリをマウントしたことが判明しました
csch

残念ながら、これはWindowsまたはOS Xユーザーには機能しません。この問題に関する議論は...活発だった。
ジェイソン

githubなどのソース管理に「コミット」してマウントしていますか?または私は毎回それをしなければなりませんか?
pie6k

23

この問題は、Dockerコミュニティで繰り返し発生しています。基本的に、Dockerfileあなたがそれを実行するか、私がそれを実行する場合、繰り返し可能であるという要件に違反します。このチケットで説明されているように、Dockerfile ADDコマンドはホスト#1676のシンボリックリンクをたどりません

そのため、別のアプローチを考えなければなりません。この問題を見てみると:引数#6094のシンボリックリンクをサポートするために追加すると、U&Lの友人(@Patrick aka。phemmer)が賢い回避策を提供します。

$ tar -czh . | docker build -

これはtar、現在のディレクトリからシンボリックリンクを逆参照し、それらをすべてdocker build -コマンドにパイプするよう指示します。

tar manページからの抜粋
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
これは素晴らしいソリューションです!Dockerがこの機能を省略したいと主張する理由を理解しています。ただし、containerizeプロジェクトの開発中に使用するワークフローと、実稼働用にビルドする方法にはかなりの違いがあります。私のローカルマシンでは、非常にタイトなフィードバックループが必要です。私のアプリには1つのgitリポジトリがあり、コンテナのビルド環境には2番目のリポジトリがあります。コミットしてプッシュするかどうかを決定する前に、編集を行い、テストをローカルでビルドできる必要があります。最終プロジェクトでは、シンボリックリンクやADD命令はありません。
ブルーノブロノスキー

6
Dockerfilesは再現できません。Dockerfileは、ほとんどすべてがapt-getまたは2番目または3番目のレイヤーに同等のものを持っているため、繰り返し可能にすることはできません。apt-getは繰り返し可能ではありません。Dockerの開発戦略を、不可能を実現するための見当違いの試みに結びつけると、だれも役に立たない一連の悪い抽象化でDockerがサドルされます。 nathanleclaire.com/blog/2014/09/29/...
ジェイソン

1
わかりました、それで私はこれがcpコマンドよりも優れている理由が本当にわかりません、なぜそれが優れているのか説明できますか?また、パイプが混乱している/過度に複雑になっていると思います。ビルドコマンドの上にtarコマンドを配置しないだけです。シンボリックリンクされたディレクトリを実際のディレクトリで上書きするからです。
アレクサンダーミルズ

1
@AlexanderMills-何が起こるかを見る最良の方法は、それを試して違いを見ることです。また、上記はコンテナの建物であり、ランニングではないため、取り付けはありません。stackoverflow.com/questions/37328370/...。これらすべてを試してみることを強くお勧めします。
slm

1
/bin/cp ../requirements.txt . && docker build ...DockerをビルドするためにMakefileに追加したばかりで、それは簡単
でした-user5359531
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.