• Post author:
  • Post category:Docker
  • Post last modified:May 9, 2024
  • Reading time:19 mins read
Copy Files Host to Docker Container

How to copy files from the host to the docker container? In order to copy files from the host to the docker container you can simply use the docker cp command with source file and container destination path. This is a common task when working with Docker containers. This can be done for a variety of reasons, such as seeding a database, configuring application settings, or transferring essential files.

Advertisements

In this article, we will explore multiple methods for copying files from your host machine into a Docker container.

Prerequisites

Before we jump into the methods and code examples, ensure that you have the following prerequisites:

  1. Docker is installed on your host machine.
  2. A Docker image or container where you intend to copy files. You can either use an existing image/container or create a custom one.

1. Copy Files from the Host to the Docker Container

You can use the docker cp command to copy files from the host to a running Docker container. In order to run this command you need to know the container ID first as it needs to specify in the command.

Step 1: Identify the Container ID

First, identify the ID of the container where you want to copy the file. You can do this by running:


# List all running containers to view their details
docker ps
 

From the running list, identify the container you want to copy the file. From the output use the CONTAINER ID section, do not use a IMAGE section.

Step 2: Use docker cp to Copy the File

Once you have the container ID, you can use the docker cp command to copy the file from the host to the container. Here’s the command:


# Copy the file from the host machine to the specified container
docker cp /path/to/host/file.txt a1b2c3d4e5f6:/app/file.txt

The docker cp command is used to copy files or directories between the host machine and a Docker container.

  • /path/to/host/file.txt is the path to the file on the host machine that you want to copy into the container.
  • a1b2c3d4e5f6 should be replaced with the actual ID or name of the Docker container.
  • /app/file.txt is the destination path inside the container where you want to copy the file.

So, when you run this command, it will copy the file.txt from your host machine to the /app/ directory inside the Docker container with the ID or name a1b2c3d4e5f6.

Make sure to replace a1b2c3d4e5f6 with the correct container ID or name, and ensure that the container is running and accessible for the docker cp command to work.

Step 3: Verify the File Copy

You can verify that the file has been copied successfully by executing a command within the container. For example, you can run:


# Use the 'docker exec' command to run a command within a running container
docker exec a1b2c3d4e5f6 ls /app/
 

The command docker exec a1b2c3d4e5f6 ls /app/, is used to execute the ls command within a running Docker container with the ID or name a1b2c3d4e5f6 and list the contents of the /app/ directory within that container.

Here’s what each part of the command does:

  • docker exec: This is the Docker command used to execute a command within a running container.
  • a1b2c3d4e5f6: This should be replaced with the actual ID or name of the Docker container you want to run the command in.
  • ls: This is the command that you want to run inside the container. In this case, it’s the ls command, which lists the contents of a directory.
  • /app/: This is the path to the directory you want to list the contents of within the container.

Make sure to replace a1b2c3d4e5f6 with the correct container ID or name. If the container is running and accessible, running this command will list the contents of the /app/ directory within that container.

2. Copy using docker exec Command

You can also use the docker exec command to copy the files from the local host machine to the docker container. The docker exec command allows you to run a command inside a running Docker container.


# docker exec - Copy file from host to container
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/

Here,

  • docker exec -i <container_id>: This part runs a command inside the Docker container specified by <container_id>. The -i option allows you to provide input to the command interactively.
  • bash -c 'cat > /path/to/container/file': This part runs a bash shell within the container and executes the cat command to copy the content of a file. Replace /path/to/container/file with the path to the container file where you want to write the content.
  • < /path/to/host/file: This part specifies the source file on the host machine from which you want to read the content and pass it to the cat command.

Make sure to replace <container_id> and the file paths with your actual container ID and file paths.

3. Using dockerfile to Copy file into Image

In case you want to copy the file from the building host to the container, the best practice is to include the file in the image by specifying in the dockerfile. The Dockerfile is a build script used to build Docker images. The below snippet copies a file named file.txt from the build context into the /app/bin/ directory inside the image.


# Use a valid Ubuntu base image (replace with the correct version)
FROM ubuntu:20.04

# Create the destination directory
RUN mkdir -p /app/bin

# Copy file.txt from the build context into /app/bin/ inside the image
COPY file.txt /app/bin/file.txt

Here,

  • We’ve used Ubuntu version (20.04) as a base image.
  • We’ve added a RUN instruction to create the /app/bin/ directory inside the image.
  • We use the COPY command to copy file.txt from the build context to /app/bin/ within the image.

Now build the image using the below command.


# Build the image
docker build .

4. Copy Multiple Files from Host to Container

You can also use the same docker cp command to copy multiple files from the host to the docker container. However, you cannot list all multiple files with a comma separator as it is not the right syntax.

So, to copy the multiple files from host to container, you need to literally write the docker cp command for each file. alternatively, you can also list all file names in an array and copy the files in a loop.


# Copy all files from the host machine to the specified container
docker cp /path/to/host/file.txt a1b2c3d4e5f6:/app/file.txt
docker cp /path/to/host/file2.txt a1b2c3d4e5f6:/app/file2.txt

To copy all files, just use the wildcard letter *


# Copy all files from the host machine to the specified container
docker cp /path/to/host/* a1b2c3d4e5f6:/app/

The command provided, docker cp /path/to/host/* a1b2c3d4e5f6:/app/, attempts to copy all files and directories from the /path/to/host/ directory on your host machine into the /app/ directory inside the Docker container with the ID or name a1b2c3d4e5f6.

5. Using the Python Docker SDK to Copy Files to Container

One of the most effective ways to copy files from the host to a Docker container is by using the Docker SDK for Python (docker-py). Python is a versatile language that is widely used for automating tasks, including interacting with Docker.

Installation:

Before using docker-py, make sure to install it:


# Install docker
pip install docker
 

Example:

Let’s create a Python script to copy a file from the host machine to a running Docker container using the docker-py library. In this example, we’ll copy a file named file.txt from the host to the /app directory within the container.


# Import
import docker

# Initialize the Docker client
client = docker.from_env()

# Specify the container and file paths
container_name = 'my_container'
host_file_path = '/path/to/host/file.txt'
container_file_path = '/app/file.txt'

# Get the container object
container = client.containers.get(container_name)

# Copy the file from the host to the container
container.put_archive('/', host_file_path)

# Verify that the file has been copied
container.exec_run(f'ls {container_file_path}')

In this Python script, we use the docker.from_env() method to create a Docker client instance. Then, we specify the container name, the path to the host file (host_file_path), and the path within the container (container_file_path) where we want to copy the file.

The container.put_archive() method is used to copy the file from the host to the container’s root directory (‘/’). Finally, we use container.exec_run() to execute a command within the container to confirm that the file has been successfully copied.

6. Using Docker Volume Mounts

Another effective way to copy files from the host to a Docker container is by using Docker volume mounts in conjunction with Python. This approach allows you to share directories between the host and the container, making it easy to transfer files.

Example:

Let’s create a Python script to copy a file from the host to a running Docker container with Docker volume mounts. In this example, we will use a Docker volume named my_volume to facilitate the file transfer.


import docker
import os

# Initialize the Docker client
client = docker.from_env()

# Specify the container and volume names
container_name = 'my_container'
volume_name = 'my_volume'

# Create a Docker volume
client.volumes.create(volume_name)

# Get the container object
container = client.containers.get(container_name)

# Specify the source file on the host
host_file_path = '/path/to/host/file.txt'

# Specify the destination directory within the container
container_file_path = '/app/'

# Copy the file from the host to the volume
with open(host_file_path, 'rb') as file:
    data = file.read()
    container.put_archive(container_file_path, data)

# Verify that the file has been copied
container.exec_run(f'ls {container_file_path}')

In this Python script, we use the docker.from_env() method to create a Docker client instance. We then specify the container name, volume name, and the paths to the host file (host_file_path) and the destination directory within the container (container_file_path).

We create a Docker volume named my_volume using client.volumes.create(), and then obtain the container object using client.containers.get(). We read the content of the host file and use container.put_archive() to copy the file data to the specified destination directory within the container. Finally, we execute a command within the container to confirm that the file has been successfully copied.

7. Using Docker to Compose

Docker Compose is a powerful tool for defining and running multi-container Docker applications. You can use Docker Compose in conjunction with Python to automate file copying operations.

Example:

Let’s create a Docker Compose configuration file (docker-compose.yml) and a Python script to copy a file from the host to a Docker container using Docker Compose.

docker-compose.yml:


version: '3'  # Docker Compose version 3
services:
  my_container:
    image: my_image  # Specify the Docker image for the container
    volumes:
      - ./path/to/host:/app  # Mount the host directory to /app in the container

 

In this Docker Compose configuration, we define a service named my_container that uses the my_image image. We also specify a volume that mounts the host directory (./path/to/host) to the /app directory within the container.

Now, let’s create a Python script to initiate the Docker Compose process and copy the file:


import subprocess

# Run Docker Compose to start the container
subprocess.run(['docker-compose', 'up', '-d'])

# Specify the source file on the host
host_file_path = '/path/to/host/file.txt'

# Specify the destination directory within the container
container_file_path = '/app/'

# Use Docker Compose to copy the file from the host to the container
subprocess.run(['docker-compose', 'cp', host_file_path, 'my_container:' + container_file_path])

# Verify that the file has been copied
subprocess.run(['docker-compose', 'exec', 'my_container', 'ls', container_file_path])
 

In this example, we first use subprocess.run() to start the Docker Compose process with the docker-compose up -d command, which starts the my_container service defined in the docker-compose.yml file.

Then, we specify the source file on the host (host_file_path) and the destination directory within the container (container_file_path). We use subprocess.run() again to execute docker-compose cp to copy the file from the host to the container.

Finally, we use docker-compose exec to run a command (ls) within the container to confirm that the file has been successfully copied.

Conclusion

In conclusion, mastering the art of copying files from your host machine to a Docker container empowers you to streamline your development and deployment workflows. By choosing the most appropriate method and incorporating Python’s automation capabilities, you can efficiently manage data transfer and facilitate seamless interactions between your host and Docker containers.

References