ひとことで言うと
# ホスト → コンテナへコピー
docker cp ./local-file.txt my-container:/app/file.txt
# コンテナ → ホストへコピー
docker cp my-container:/app/file.txt ./local-file.txt
やりたかったこと / 現象
「コンテナの中に設定ファイルを1つだけ入れたい」「コンテナ内で生成されたログやDBダンプをホスト側に取り出したい」といった場面で、コンテナ全体を再ビルドせずにファイルだけをやり取りしたい。
docker cp はホストとコンテナの間でファイル・ディレクトリをコピーするコマンドで、Dockerfileの変更やイメージの再ビルドが不要な、その場しのぎのファイル転送に向いています。
環境
- Docker: 20.10以降で動作確認
- OS: Linux / macOS / Windows(WSL2)
解決策
1. コンテナ名・IDを確認する
docker ps
CONTAINER ID IMAGE NAMES
a1b2c3d4e5f6 nginx my-container
NAMES 列の my-container か CONTAINER ID を指定します。
2. ホストからコンテナへコピーする
docker cp ./config.yml my-container:/etc/app/config.yml
コピー先のディレクトリ(この例では /etc/app/)は事前に存在している必要があります。存在しない場合はエラーになります。
3. コンテナからホストへコピーする
docker cp my-container:/var/log/app.log ./app.log
コンテナ内のログファイルやDBダンプをホスト側に取り出すときによく使う書き方です。
4. ディレクトリごとコピーする
# ホスト → コンテナ(ディレクトリごと)
docker cp ./dist my-container:/usr/share/nginx/html
# コンテナ → ホスト(ディレクトリごと)
docker cp my-container:/app/logs ./logs
ファイル・ディレクトリのどちらを指定しても同じ docker cp コマンドでコピーできます。
5. 停止中のコンテナに対してもコピーできる
docker ps -a
docker cp ./config.yml stopped-container:/etc/app/config.yml
docker cp はコンテナが起動していなくても実行できます(起動しているプロセスへの介入ではなく、コンテナのファイルシステムを直接操作するため)。
6. docker-compose環境でのコンテナ名の確認
docker compose ps
docker compose で立ち上げた場合、コンテナ名は プロジェクト名_サービス名_1 のような形式になることが多いので、docker ps や docker compose ps で正確な名前を確認してからコピーしましょう。
よくあるエラーと対処
Error: No such container:path: my-container:/app/file.txt
コピー元のパスがコンテナ内に存在しません。コンテナに入って確認しましょう。
docker exec -it my-container ls /app
lstat /path/to/local-file: no such file or directory
ホスト側のコピー元パスが間違っています。相対パスを使う場合は、実行しているディレクトリを確認してください。
pwd
ls -la ./local-file.txt
コピー先ディレクトリがなくてエラーになる
Error response from daemon: ... no such file or directory
コンテナ内にコピー先のディレクトリが存在しないと失敗します。先にディレクトリを作成してからコピーします。
docker exec my-container mkdir -p /etc/app
docker cp ./config.yml my-container:/etc/app/config.yml
コピーしたファイルの所有者がrootになる
docker cp はデフォルトでコピー先の所有者をコンテナ内のrootにすることが多く、アプリの実行ユーザーと異なる場合、パーミッションエラーの原因になります。
docker exec my-container chown appuser:appuser /app/file.txt
よくある質問
Q: docker cp はコンテナが起動していなくても使えますか?
使えます。停止中のコンテナでもファイルシステムには直接アクセスできるため、docker cp は実行可能です。
Q: ワイルドカード(*)は使えますか?
docker cp 自体はワイルドカードをサポートしていません。複数ファイルをコピーしたい場合はディレクトリごとコピーするか、tar と組み合わせる方法があります。
Q: シンボリックリンクはどう扱われますか?
デフォルトではシンボリックリンクの実体ではなく、リンクそのものがコピーされます。実体を追跡したい場合は docker cp -L オプションを使います。
Q: docker cp と bind mount(-v オプション)はどう使い分けますか?
継続的にファイルを同期させたい場合は bind mount が適しています。docker cp は一時的・一回限りのファイル転送に向いています。
Q: docker-compose 環境でも使えますか?
使えます。docker compose ps でコンテナ名を確認し、通常の docker cp と同様に指定します。
Q: コピー中にコンテナが停止したらどうなりますか? コピー処理はDockerデーモンがファイルシステムに対して直接行うため、コンテナの起動状態が途中で変わっても影響を受けにくいですが、基本的にはコピー完了後に他の操作を行うことを推奨します。
関連記事
おすすめのVPS/ドメイン/スクール
VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。