Copy Files From Docker To Host

Copy Files From Docker To Host

Reading time1 min
#Docker#DevOps#Containers#dockercp#containerfiles#copyfiles

Copying Files From Docker Containers to the Host

When working with containerized systems—especially during rapid development or debugging—it's common to need files that exist only inside a running Docker container. Log archives, configuration snapshots, on-demand reports, or even temporary uploads: all sometimes need to be extracted without preconfigured volume mounts or container restarts. Setting up volumes for every edge case is impractical. Here’s a professional approach using Docker’s built-in tooling.


Direct Extraction: docker cp

The docker cp command enables copying files or entire directories between the host and running (or stopped) containers. This avoids re-architecting containers or introducing dynamic bind-mounts late in the cycle. Useful with both immutable infrastructure and in quick prototypes.

Syntax Summary

docker cp <container>:/path/in/container /host/absolute/or/relative/path
docker cp /host/path <container>:/container/path

But for file extraction, always start with:

docker cp <container_name_or_id>:<container_path> <host_path>

Tested on Docker 20.10.x through 24.x, syntax and behavior are consistent. No restart required.


Applied Example: Extracting Logs From a Live Container

Scenario: A container running custom application code accumulates a crucial log file. You must retrieve it for debugging, but no volume mount was attached.

Step 1: Identify Container

Get the active container ID or name. Example output for reference:

docker ps
CONTAINER ID   IMAGE          COMMAND            STATUS            NAMES
e1fd3a4c2d85   myapi:1.8.4    "node index.js"    Up 11 minutes     prod-api01

Step 2: Locate Target Path

If needed, confirm the exact file location within the filesystem:

docker exec prod-api01 ls -lh /app/logs/

Sample output:

-rw-r--r-- 1 appuser appgroup 1.5M Jun 10 09:02 access.log

Step 3: Extraction Command

To copy the access.log file into your current working directory:

docker cp prod-api01:/app/logs/access.log .

Alternatively: Copy the entire logs directory (recursive, preserves structure):

docker cp prod-api01:/app/logs ./logs

Docker will create the destination directory if it doesn’t exist.

Step 4: Verification

Always confirm byte counts and permissions post-copy:

ls -lh access.log
sha256sum access.log

If discrepancies arise—common with large logs or mid-write files—repeat extraction with less container load.


Note: Permissions and Access

  • docker cp operates as root in the container context. Files owned by privileged users will still copy.
  • SELinux or AppArmor host configurations are not enforced on extracted files.
  • Lack of read permissions inside the container causes silent copy failures—no files, no warning.

Cross-Platform Caution

  • On Windows (PowerShell), path delimiters and quoting can result in unexpected paths. Always verify:
    • Container: / notation
    • Host: Use absolute Windows paths or relative paths in project root.

Non-Trivial Tips

  • For airgapped clusters, docker cp can extract artifacts without container registry push/pull or external storage hops.
  • Output piping: docker cp does not support streaming to stdout; intermediate files are mandatory. If you need streamed out copies (e.g., to tar over SSH), consider:
    docker exec prod-api01 tar czf - /app/output | ssh user@host 'tar xzf - -C /data'
    
    This technique avoids Docker’s local file handling altogether (and is faster for very large datasets).
  • Copying from stopped containers is fully supported; ephemeral containers (run --rm) are lost after exit.

Gotchas

  • Paths must be absolute inside the container. Relative paths fail with Error: no such file or directory.
  • Wildcards (*) aren’t supported; specify exact files or directory names.
  • Active writes inside the container can cause partial files or corruption on the host side. Consider quiescing application writes before extraction, especially with SQLite DBs or other changing data.

Summary Table

OperationCommand ExampleNotes
Copy file from container to hostdocker cp cid:/etc/conf.yml ./conf.ymlFile must exist at specified path
Copy entire folder from containerdocker cp cid:/var/tmp ./tmpCreates tmp/ on host if missing
Copy to a running containerdocker cp ./local.bin cid:/usr/bin/local.binUseful for ad-hoc patching/test exec

When you need an artifact, log, or dump outside the container, avoid downtime or additional mounts: use docker cp. This process is robust, works in production and ephemeral environments, and—outside of major security lockdowns—gets the job done with minimal friction.

Manual extraction is never elegant, but it’s often necessary. Choose volume mounts for planned persistency; use docker cp for incident response and unplanned needs. If planning for automation or regular extraction, integrate this into a maintenance script.


Known Issue: Containers running with aggressive file locking (e.g., some databases) may yield incomplete or locked files during copy. Always validate output before relying on data integrity.


For ongoing CI/CD pipelines or automated artifact collection, review using explicit shared volumes or object storage as a long-term solution, but keep docker cp in your operational toolkit.