web-dev-qa-db-ja.com

Dockerfile COPY命令が失敗しましたか?

すべて、ホストからイメージにファイルを永続的にコピーしようとしているので、それらのファイルはそのイメージに基づいて起動されたすべてのコンテナで使用できます。 virtualboxゲストとしてdebian wheezy 64ビットで実行しています。

dockerfileはかなり単純です(オクターブイメージをインストールする):

FROM debian:jessie 
MAINTAINER GG_Python <[redacted]@gmail.com>
RUN apt-get update 
RUN apt-get update
RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics

RUN mkdir /octave
RUN mkdir /octave/libs
RUN mkdir /octave/libs/jsonlab
COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.

ビルドコマンドを発行した後、次のトレースを取得しています:docker build -t octave .

Sending build context to Docker daemon 423.9 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:jessie
 ---> 58052b122b60
Step 1 : MAINTAINER GG_Python <[..]@gmail.com>
 ---> Using cache
 ---> 90d2dd2f7ee8
Step 2 : RUN apt-get update
 ---> Using cache
 ---> 4c72c25cd829
Step 3 : RUN apt-get update
 ---> Using cache
 ---> b52f0bcb9f86
Step 4 : RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics
 ---> Using cache
 ---> f0637ab96d5e
Step 5 : RUN mkdir /octave
 ---> Using cache
 ---> a2d278b2819b
Step 6 : RUN mkdir /octave/libs
 ---> Using cache
 ---> 65efbbe01c99
Step 7 : RUN mkdir /octave/libs/jsonlab
 ---> Using cache
 ---> e41b80901266
Step 8 : COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.
INFO[0000] ~/octave/jsonlab/loadjson.m: no such file or directory 

Dockerは、このファイルをホストからイメージにコピーすることを絶対に拒否します。言うまでもなく、ファイルloadjson.mが存在する(猫が表示する)ため、パス(相対、絶対など)を変更するすべての試みが失敗しました。この単純なタスクに問題がある理由はありますか?

15
GG_Python

私が最初にこれを書いたとき、Dockerは〜または$ HOMEを展開しませんでした。ビルドコンテキスト内でいくつかの拡張を行うようになりましたが、それでもおそらくあなたが望むものではありません。それらはコンテキスト外のホームディレクトリではありません。ファイルを明示的に参照するか、Dockerfile自体に対して相対的にパッケージ化する必要があります。

17
kojiro

Dockerは、コンテキストからファイルのみをコピーできます。フォルダーは、dockerignoreファイルにリストされているファイルを除いたフォルダーです。

'docker build'を実行すると、Dockerはコンテキストをtarし、接続しているdockerデーモンに送信します。デーモンはリモートマシンである可能性があるため、コンテキスト内のファイルのみをコピーできます。

10

コンテキストを理解するまでCOPYを動作させることができませんでした(コンテキストの外部からファイルをコピーしようとしていました)

Docker buildコマンドは、Dockerfileとコンテキストからイメージをビルドします。ビルドのコンテキストは、指定された場所のPATHにあるファイルです。 PATHはローカルファイルシステム上のディレクトリです。

コンテキストは再帰的に処理されます。そのため、PATHにはサブディレクトリが含まれます。

ビルドは、CLIではなく、Dockerデーモンによって実行されます。ビルドプロセスが最初に行うことは、コンテキスト全体を(再帰的に)デーモンに送信することです。ほとんどの場合、空のディレクトリをコンテキストとして開始し、Dockerfileをそのディレクトリに保持するのが最善です。 Dockerfileの構築に必要なファイルのみを追加します。

警告:ビルドがハードドライブのコンテンツ全体をDockerデーモンに転送するため、ルートディレクトリ/をPATHとして使用しないでください。

リファレンス: https://docs.docker.com/engine/reference/builder/#usage

5
Robert Brooker