web-dev-qa-db-ja.com

Dockerはコンテキスト外のシンボリックリンクをたどる

さらに別のDockerシンボリックリンクの質問。すべてのDockerビルドにコピーしたいファイルがたくさんあります。私のディレクトリ構造は次のとおりです。

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

上記の例では、dir1内にdocker buildするときにfile.txtがコピーされるようにします。しかし、file.txtの複数のコピーを保持したくありません。 このリンク、Dockerバージョン0.10以降 ごとに、Dockerビルドは

ADDビルド手順については、コンテナのルート内のシンボリックリンクに従ってください。

しかし、Dockerfileで次のいずれかの行を使用してビルドすると、そのようなファイルまたはディレクトリはありません

ADD symlink /path/dirnameまたはADD symlink/file.txt /path/file.txt

マウントオプションはそれを解決しません(クロスプラットフォーム...)。 tar -czh . | docker build -tを試しましたが成功しませんでした。

Dockerがシンボリックリンクをたどり、common_files/file.txtをビルドされたコンテナにコピーする方法はありますか?

57
Ravi

それは不可能であり、実装されません。 github issue#1676についての議論 をご覧ください。

繰り返しできないため、これは許可しません。マシン上のシンボリックリンクは私のマシンと同じではなく、同じDockerfileは2つの異なる結果を生成します。また、/ etc/paasswdへのシンボリックリンクがあると、ローカルファイルではなくホストファイルをリンクするため、問題が発生します。

49
h3nrik

この問題を抱えている他の人については、 このリンクを参照 にしてください。個人的には、「共通ベースイメージの構築」ソリューションを選択しましたが、これは見事に機能します。

5
Paul Carroll

1つの可能性は、親ディレクトリでビルドを実行することです:

$ docker build [tags...] -f dir1/Dockerfile .

(または同等に、子ディレクトリ内)

$ docker build  [tags...] -f Dockerfile ..

Dockerfileは、適切なパスでコピー/追加を行うように構成する必要があります。設定によっては、親に.dockerignoreを追加して、コンテキストに入れたくないものを除外することができます。

2
shaunc

simlinksを使用する代わりに、simlinksをコピーまたは作成する代わりに、sites_availableからsites_enabledにファイルを移動するだけで、管理上の問題を解決できます。

したがって、サイトの構成は、停止した場合はsite_availableフォルダー、または使用する必要がある場合はsites_enabledフォルダーの1つのコピーのみになります。

2
Ilya Kolesnikov