cpコマンドの使い方を解説します。ver18.09.0に対応してます。このコマンドは、Dockerホスト内のファイル/ディレクトリをコンテナ内にコピー、もしくはコンテナ内のファイル/ディレクトリをDockerホストにコピーすることが出来ます。※DockerホストとはDocker本体が稼働しているコンピュータを指します。コピーは、起動しているコンテナだけで無く、停止しているコンテナでも可能です。ハイパーバイザ型の仮想環境では、仮想マシン環境内にftpデーモンなどのサービスを起動して、ホストマシンとのファイルの受け渡しを行うことが多いと思います。cpコマンドを使用してファイルのやり取りを行います。それでは以下で詳細に解説いたします。]主なオプション一覧-aコピー元のファイルオーナ情報をコピー先のファイルに引き継ぎます。(バグ確認)-Lコピー元内のシンボリックリンクをフォローします。リンク先の実ファイルがコピー対象となります。以下の実例は、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。init」で起動します。Dockerホスト内のファイルをコンテナ内にコピーするDockerホスト内のファイル(例えばfile01.txt)をコンテナ内の/opt下にコピーします。testvm:/opt以下のコマンドでコンテナ内のファイルを確認できます。file01.txtDockerホスト内のファイルをコンテナ内に別名でコピーも出来ます。testvm:/opt/file99.txt確認です。■コンテナ内のファイルをDockerホストにコピーするコンテナ内のファイル(例えば/etc/hosts)をDockerホスト内のカレントディレクトリにコピーします。.別名でのコピーも可能です。hosts.tmpDockerホスト内のディレクトリをコンテナ内にコピーするDockerホスト内にディレクトリdir2を作成し、更にそのディレクトリdir2内にファイルを作成します。file02.txtディレクトリdir2をコンテナ内のoptディレクトリにコピーします。testvm:/opt確認します。■コンテナ内のディレクトリをDockerホスト内にコピーするコンテナtestvm内に/var/logディレクトリがあります。事前に、そのディレクトリの中身を確認しておきます。/var/logいくつかファイルとディレクトリが入っていることが確認できます。yum.logこのコンテナtestvm内の/var/logディレクトリを、Dockerホストのカレントディレクトリにコピーしてみます。yum.logDockerホストのカレントディレクトリにlogディレクトリがコピーされて、そのディレクトリ内にコンテナ内にあったファイルとディレクトリがコピーされていることが確認できました。コピーされたファイルとディレクトリのオーナーに関しましては後述しております。■ファイルのパーミッションは引き継がれるDockerホスト内にパーミッションが664のファイルを作成しました。file03.txtこのDockerホスト内のファイルfile03.txtをコンテナ内にコピーします。testvm:/optコンテナ内のfile03.txtのパーミッションを確認します。file03.txtコンテナ内のファイルもパーミッションが664になってます。次に、コンテナ内のfile03.txtのパーミッションを666に変更後、Dockerホストにコピーします。file03.txtコンテナ内のfile03.txt(パーミッションは666)をDockerホストにfile10.txtとしてコピーします。file10.txtコピーしたファイルのパーミッションが666であることを確認します。--helpを実行すると表示される)を見たところ、新しく「-a」が追加されていました。Docker公式ドキュメント(18.09版)を確認したところ、以下の表記がありました。-aコマンドのように動作します。可能であれば、ディレクトリは再帰的にコピーされ、パーミッションは保存されます。所有権は、宛先のユーザーおよびプライマリグループに設定されます。コンテナにコピーされたファイルは、ルートユーザーのUID:GIDで作成されます。cpコマンドを呼び出したユーザーのUID:GIDで作成されます。cpは所有者をソースのユーザーおよびプライマリグループに設定します。デフォルトではファイルのオーナ情報は引き継がないが、「-a」オプションを付けることでオーナを引き継ぐように仕様が変わったようです。実際に試してみました。Dockerホスト上にファイルを作成します。file03.txtオーナ情報を確認します。file03.txtコンテナtestvm内にコピーします。testvm:/rootコンテナtestvm内のfile03.txtファイルを確認します。file03.txtコンテナtestvm内にtest01ユーザが存在していませんでしたので、Dockerホスト上のtest01ユーザのuidである2000が表示されています。確かにコピー元のオーナ情報がコピー先に引き継がれています。念のため、「-a」オプション無しでコピーしてみました。コンテナtestvm内のファイルを削除します。/rootコピーしてみます。testvm:/rootコンテナtestvm内のfile03.txtファイルの確認です。file03.txtオーナは引き継がれています・・・。この動作に関しましては追跡していきたいと思います。コピー対象がディレクトリの場合もファイルと同様の動作内容でした。ちなみに、コンテナ内のファイルをDockerホスト上にコピーしてみたのですが、こちらの方は「-a」を付けても付けなくてもオーナ情報は引き継がれませんでした。■シンボリックリンク用のオプション-Lについてオプションを付けない場合は、シンボリックリンクそのものがコピーされます。オプションを付けた場合は、リンク先のファイルがコピーされます。コピー先のファイル名は、コピー元のシンボリックリンクの名前になります。Dockerホスト上で、まずディレクトリdir5内にファイルfile05.txtを作成します。そのfile05.txtにシンボリックリンクlnfile05.txtを設定します。lnfile05.txtfile05dir5内のfile05.txtには「file05」と書き込みました。このDockerホスト内のシンボリックリンクのファイルをコンテナ内の/optにコピーしてみます。オプション無しでやってみます。testvm:/optコピー先のファイルを確認してみます。dir5/file05.txtシンボリックリンクそのものがコピーされてます。内容を表示してみます。directoryリンク先のファイルが存在しないので当然の結果ですね。コピーしたコンテナ内のシンボリックリンクを削除します。/opt/lnfile05.txt今度は-Lオプションを付けて試してみます。testvm:/optコピー先のファイルを確認してみます。lnfile05.txtコンテナ内にlnfile05.txtが作成されましたが、シンボリックリンクではありません。内容を表示してみましょう。/opt/lnfile05.txtfile05コピー元のシンボリックリンクのリンク先のファイルfile05.txtの内容になっています。コンテナ内のシンボリックリンクをDockerホスト内にコピーする場合も、同じ動作になります。実例は省略させてください。■tarファイルの中身をコンテナ内に展開、またはコンテナ内のファイルやディレクトリをtarファイルに格納するコンテナ内の/optディレクトリ下のファイルをDockerホスト上のtarファイルに格納します。test.tarコピー先として「-」を指定してますが、これはDockerホストの標準出力を意味します。cpコマンドは、コピー元の内容をtar形式で標準出力に出力します。上記コマンドは、その出力内容をtest.tarにリダイレクトで出力してます。tvf」コマンドでtarファイルの内容を確認してみます。opt/test06.txt確かにコンテナ内の/opt下のファイルが格納されてます。今度は、このtarファイルの内容を、コンテナ内の/tmp下に展開してみます。test.tarコピー元として「-」を指定してますが、これはDockerホストの標準入力を意味します。cpコマンドは、標準入力から入力された内容をtar形式として受け取り、コピー先に展開します。上記コマンドは、test.tarからリダイレクトで、そのファイルの内容を入力してます。コンテナ内のコピー先を確認してみます。test06.txtコピー先/tmpにoptディレクトリが作成されており、optディレクトリ内にtest06.txtファイルが展開されていることが確認できます。■コピー先に同名のファイルが存在する場合の動作についてコピー先に同名のファイルが存在する場合は、確認無く上書きされます。コンテナ内の/optにファイルtest06.txtがあります。/opt/test06.txtaaaaaaaaaaabbbbbbbbbbbccccccccccc以下のDockerホスト内のファイルtest06.txtを準備しました。test06.txtzzzzzzyyyyyyxxxxxxこのファイルをコンテナ内の/optにコピーしてみます。testvm:/optコピーしたファイルの内容を確認してみます。/opt/test06.txtzzzzzzyyyyyyxxxxxx上書きされました。停止中のコンテナにDockerホストのファイルをコピーするまず、コンテナtestvmを停止します。testvmコンテナ内の/etc/hostsファイルを、Dockerホスト内のカレントディレクトリにコピーします。hosts.tmp2もちろん逆に、Dockerホスト内のファイルをコンテナ内にコピーも出来ます。cpコマンドの紹介を終わります。ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(ver1.12対応版)(オリジナルな実例付き)」をご参照ください。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。テニス、作品鑑賞(映画、アニメ、ドラマ、絵画など)、讃岐うどん食べ歩き。コンピュータ業界に身を置く中年おやじです。世の中にはまだ自分が知らない情報があふれていて、知っているつもりでも全体の半分も知らないことがいっぱいあります。見つけた情報はGoogleKeepにメモる毎日です。ある日、自分が良いと思うことは、同じように感じる方も、数は少ないかもしれないけどいるはず、と思いまして、そのことが本サイト「めもたんす」を作るきっかけとなりました。自分がいいなと思ったことを記事にまとめたサイトです。technology.。