Docker:親ディレクトリからファイルを追加する


186

Dockerfileは持っています:

ADD ../../myapp.war /opt/tomcat7/webapps/

そのファイルは存在するls ../../myapp.warので正しいファイルが返されますが、実行するsudo docker build -t myapp .と次のようになります。

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

誰かがそれを正しく行う理由と方法を知っていますか?


回答:


225

Dockerfileは親ディレクトリからビルドできます。

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
ありがとうございました!これはローカルボックスで正常に動作しますが、Docker Hubは同じディレクトリからイメージを作成しようとするため(tbh、通常期待されるとおり)、イメージのビルドに失敗します。Docker Hubで同じトリックを実行する方法はありますか?
マルセルエルナンデス

私が知っていることではありません。自動ビルドを使用する代わりに、イメージをレジストリにプッシュできます。
Boedy 2016年

2
@ eduncan911私がコメントを書いている時点では、これは非推奨ではないと思います。それ以来、彼らは考えを変えたのだろうか?私が間違っている場合は、廃止予定であると記載されているドキュメントにリンクできますか。ありがとう!
omn​​inonsense 2017

6
-f しません > -ドキュメントごとに廃止されるように見えるDockerfile(-f)を指定docs.docker.com/engine/reference/commandline/build/...
レイ

6
@ eduncan911コメントは非推奨ではないため、削除できますか?あなたのコメントのため、最初はこの回答をスキップしました。
クリスアンダーソン、

103

残念ながら、(実用上およびセキュリティ上の理由から)ローカルコンテンツを追加/コピーする場合は、と同じルートパスの下に配置する必要がありますDockerfile

ドキュメントから:

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

編集:-f Dockerfileのパスを設定するオプション()があります。それはあなたが望むものを達成するために使用することができます、@ Boedyの応答を下で見てください。


22
これに対する「クリーンな」回避策はありますか?これに対応するためだけに、プロジェクトディレクトリ全体を再構築したくありません。
ben_frankly 2014年

@Günterが言ったように、ここに回避策がありますsuperuser.com/a/842690/136024 ...それは本当に「クリーン」ですか?まあ、それは少なくとも「回避策」です:)
Anthony O.

2
@Boedyからより良い回答を見るstackoverflow.com/a/34300129/2950621
nmgeek '19年

103

docker-composeを使用すると、コンテキストフォルダーを設定できます。

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

9

受け入れられた回答をサポートするためのコードスニペットを追加します。

ディレクトリ構造:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Dockerファイルエントリ:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Dockerイメージの構築に使用されるコマンド

docker build -t test:latest -f setup/docker/Dockerfile .

素晴らしいアプローチ。install_x.sh同様にコードを共有することは可能ですか?
Ariful Haque

4

composerを使用する人のための解決策は、親フォルダーを指すボリュームを使用することです。

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

しかし、Dockerfileのボリュームを操作することでかなりのことができると確信しています。


3
できません。注:ホストディレクトリは、その性質上、ホストに依存しています。このため、ビルドされたイメージは移植可能でなければならないため、Dockerfileからホストディレクトリをマウントすることはできませんホストディレクトリは、すべての潜在的なホストで利用できるわけではありません。docs.docker.com/engine/tutorials/dockervolumes/...
Peeter Kokk

4

ので-f、別の問題を引き起こし、私は別のソリューションを開発しました。

  • 親フォルダーにベースイメージを作成する
  • 必要なファイルを追加しました。
  • この画像を子孫フォルダにあるプロジェクトのベース画像として使用しました。

-fフラグは、私のために私の問題を解決していないonbuildフォルダ内のファイルの画像ルックスと、このように呼び出す必要がありました:

-f foo/bar/Dockerfile foo/bar

の代わりに

-f foo/bar/Dockerfile .

また、これは-fフラグとしてのいくつかのケースの唯一の解決策であることに注意してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.