Skip to main content

[SOLVED] Add a volume to Docker, but exclude a sub-folder - docker

[SOLVED] How to Add a Docker Volume While Excluding a Sub-Folder

In this chapter, we will look at how to add a volume to a Docker container while leaving out a sub-folder. Many developers need this. They want to save data in their containers but do not want extra files or folders that can make their volume storage messy. Knowing how to manage what we exclude from volumes makes our Docker skills better. It can also help the performance and keep our application environments cleaner. We will share different solutions for different situations in Docker.

Solutions We Will Discuss:

  • Solution 1: Using Docker Compose with Volume Exclusions
  • Solution 2: Creating a Bind Mount with Excluded Sub-Folders
  • Solution 3: Leveraging .dockerignore for Exclusions
  • Solution 4: Using Named Volumes with Custom Configuration
  • Solution 5: Custom Entry Point Script to Manage Exclusions
  • Solution 6: Utilizing Overlay File System for Exclusion

By using these solutions, we can manage our Docker volumes better. We can leave out certain sub-folders. This will give us a smoother Docker experience. If you want to learn more about Docker volume management, you can read our full guide on Docker Volumes.

If our containers stop running for some reason, we can check this article on why Docker containers exit. It might help us.

Let’s dive into each solution. We will help you understand Docker volume management better!

Solution 1 - Using Docker Compose with Volume Exclusions

We can add a volume to Docker and exclude a sub-folder by using Docker Compose. This helps us set up our service configuration easily. We will use the volumes key in our docker-compose.yml file. Here, we can point to the main volume and use .dockerignore files to exclude things when we build.

Here’s how we can do it:

  1. Create a .dockerignore file: This file lists the paths we want to keep out of the Docker image or not mount into the container.

    Example of a .dockerignore file to exclude a folder named excluded-folder:

    excluded-folder
  2. Define your docker-compose.yml: In this file, we will write down the volume we want for our container.

    Example of docker-compose.yml:

    version: "3.8"
    
    services:
      my_service:
        image: my_image
        build:
          context: .
          dockerfile: Dockerfile
        volumes:
          - ./data:/app/data

    Here, the ./data directory goes to /app/data in the container.

  3. Run your Docker Compose setup: We can start our services with the command below.

    docker-compose up

This way, we can control what goes into our Docker image and what is mounted when we run it. It helps us keep out the sub-folder we want to exclude. For more info on Docker Compose, check the Docker Compose documentation.

Solution 2 - Creating a Bind Mount with Excluded Sub-Folders

Another way to add a volume to Docker while keeping out a sub-folder is to use bind mounts. This lets us choose exactly what to mount from our host system. So we can avoid certain folders.

Here’s how we can do this:

  1. Structure Your Host Directory: Make sure your host directory is set up so the excluded folder is separate. For example, it can look like this:

    /path/to/host/
    ├── data/
    │   ├── included-folder/
    │   └── excluded-folder/  # This folder will not be mounted
  2. Use Docker Run Command: When we run our container, we can use a bind mount that only includes the folders we want.

    Example command:

    docker run -d \
      -v /path/to/host/data/included-folder:/app/data/included-folder \
      --name my_container my_image

In this command, only included-folder from our host will go into the container. The excluded-folder stays as it is. This gives us flexibility and keeps out folders we do not want.

For more info on bind mounts, check the article on how to mount a host directory in Docker.

Solution 3 - Leveraging .dockerignore for Exclusions

Using a .dockerignore file is a good way to keep out certain files and folders when we build a Docker image. It helps us make sure that some directories are not included in the final image or when we run it.

Here’s how we can use the .dockerignore for this:

  1. Create a .dockerignore File: Put this file in the main folder of your build context. We can list the folder we want to exclude.

    Example of a .dockerignore file:

    excluded-folder
  2. Build Your Docker Image: When we build our image with Docker CLI, the paths in the .dockerignore will not be part of the build context.

    Example build command:

    docker build -t my_image .

Using the .dockerignore, we can decide what goes into our image. This helps keep the size of our images small.

For more on Dockerfile and building images, visit what is Docker.

Solution 4 - Using Named Volumes with Custom Configuration

Named volumes in Docker help us manage data that stays the same in a container. If we want to exclude certain sub-folders, we can set up named volumes with special settings.

Here’s how we can set them up:

  1. Define Named Volumes in Docker Compose: In our docker-compose.yml, we can create named volumes for our services.

    Example of docker-compose.yml:

    version: "3.8"
    
    services:
      my_service:
        image: my_image
        volumes:
          - my_volume:/app/data
    
    volumes:
      my_volume:
        driver: local
  2. Use a Custom Configuration: Named volumes do not directly keep out sub-folders. But we can set up our data structure inside the container to make sure we do not use certain paths.

  3. Run Docker Compose: We can start our application with:

    docker-compose up

This setup lets us use named volumes while managing the folder structure inside our container to keep out unwanted sub-folders.

For more on managing Docker volumes, check the Docker Volumes documentation.

Solution 5 - Custom Entry Point Script to Manage Exclusions

Making a custom entry point script can help us manage data in our Docker container. This way, we can keep out certain sub-folders when the container starts.

Here are the steps to do this:

  1. Create a Custom Entry Point Script: Write a script that handles the volume’s content when the container starts. This script can delete or ignore the folder we do not want.

    Example entrypoint.sh:

    #!/bin/bash
    rm -rf /app/data/excluded-folder
    exec "$@"
  2. Update Your Dockerfile: Make sure your Dockerfile copies this script into the container and sets it as the entry point.

    Example Dockerfile:

    FROM my_base_image
    COPY entrypoint.sh /usr/local/bin/
    RUN chmod +x /usr/local/bin/entrypoint.sh
    ENTRYPOINT ["entrypoint.sh"]
    CMD ["my_command"]
  3. Build Your Docker Image: Build the Docker image with:

    docker build -t my_image .
  4. Run Your Container: Start your container. The entry point script will run and make sure the sub-folder is excluded.

    docker run -d -v my_volume:/app/data my_image

This way, we have a programmatic way to manage exclusions right in our container’s startup.

For more on managing container setups, refer to how to remove old and unused Docker containers.

Solution 6 - Utilizing Overlay File System for Exclusion

The overlay file system is a strong feature in Docker. It helps us manage layers and file changes well. By using this, we can exclude sub-folders from volumes.

Here’s how we can use the overlay file system:

  1. Create an Overlay Directory Structure: Set up your overlay directory in the host file system. This will help us overlay the folders we want while keeping others out.

    Example structure:

    /path/to/overlay/
    ├── lower/
    │   └── data/
    │       ├── included-folder/
    │       └── excluded-folder/
    └── upper/
        └── data/
  2. Run Your Docker Container Using Overlay: Use the overlay filesystem when starting your Docker container.

    Example command:

    docker run -d \
      --mount type=overlay,source=overlay,destination=/app/data \
      --name my_container my_image

In this command, the overlay will add included-folder to /app/data while keeping excluded-folder hidden in the container.

Using the overlay file system can help us work better and manage exclusions well. For more on Docker storage and volume management, check the Docker data storage guide.

Solution 1 - Using Docker Compose with Volume Exclusions

We can add a volume to Docker and leave out a specific sub-folder by using Docker Compose. In the docker-compose.yml file, we use the volumes key. Docker Compose makes it easy to manage apps that use multiple containers. It also lets us define volumes with special settings.

Example Configuration

Here is an example of how to set up your docker-compose.yml file to leave out a sub-folder while mounting a volume:

version: "3.8"

services:
  app:
    image: your-image:latest
    volumes:
      - app_data:/app/data
      - ./local-directory:/app/data/local-directory:ro
      - /app/data/excluded-directory

volumes:
  app_data:
    driver: local

Explanation

  1. Volume Declaration:

    • The line app_data:/app/data connects the named volume app_data to the /app/data folder in the container.
  2. Local Directory Mount:

    • The line ./local-directory:/app/data/local-directory:ro connects a local folder into the container. It is in read-only mode. If we need to write, we can change ro to rw.
  3. Exclusion:

    • By not adding excluded-directory, we leave it out of the volume. The data in excluded-directory will not be part of the mounted volume.

Additional Considerations

  • Make sure the excluded sub-folder is not used in your application code or settings. This helps to stop runtime errors.
  • Use the :ro option if we want to stop changes to the mounted folder from inside the container.

Using Docker Compose is a simple way to manage our Docker volumes. It is very helpful for complex applications. For more details on how to manage Docker volumes, we can check the Docker Volumes documentation.

This method helps us keep our development process smooth. It also helps to keep a clear separation of work. This is important when we want to make sure some folders stay safe from the Docker volume.

Solution 2 - Creating a Bind Mount with Excluded Sub-Folders

We can create a bind mount in Docker to link a specific folder on our host machine to a folder in our Docker container. But bind mounts do not directly allow us to exclude sub-folders. To do this, we can use a workaround with bind mounts and symbolic links.

Steps to Create a Bind Mount with Excluded Sub-Folders

  1. Prepare Your Host Directory: First, we need to set up the directory structure on our host. If we want to exclude the excluded_folder from the bind mount, we can create our host directory like this:

    mkdir -p /path/to/host/directory
    mkdir -p /path/to/host/directory/excluded_folder
  2. Create a Symbolic Link: Next, we create a symbolic link in the bind mount directory. This link will point to the folder we want to exclude. This way, the container will ignore the real contents of the excluded folder.

    ln -s /path/to/host/directory/excluded_folder /path/to/host/directory/ignored_folder
  3. Run the Docker Container: Now, we can start our Docker container. We will bind mount the host directory to the container. The symbolic link we made will act like a placeholder. We need to set up the container to ignore this link.

    docker run -v /path/to/host/directory:/path/in/container your_image

Example

Let’s say we have this structure on our host:

/path/to/host/directory/
│
├── data/
│   ├── file1.txt
│   └── file2.txt
└── excluded_folder/
    └── file3.txt

We want to mount /path/to/host/directory to /data in our container but exclude excluded_folder. Here is what we do:

  1. Create the symbolic link:

    mkdir -p /path/to/host/directory/ignored_folder
    ln -s /path/to/host/directory/excluded_folder /path/to/host/directory/ignored_folder
  2. Run our container:

    docker run -v /path/to/host/directory:/data your_image

Limitations

  • This method is a workaround. It might not work for every situation, especially if the excluded folder needs to be totally ignored by the app in the container.
  • The app inside the container must be set up to not look at the symbolic link.

For more info on Docker volumes and bind mounts, check the Docker Volumes documentation.

Solution 3 - Using .dockerignore to Exclude Files

We can use a .dockerignore file to leave out certain files or folders when we build our Docker images. This helps a lot when we do not want some sub-folders to be part of a volume in our Docker container.

Steps to Use .dockerignore

  1. Make a .dockerignore file in the main folder of our Docker context. This is the folder where our Dockerfile is.

  2. List the sub-folder(s) we want to leave out in the .dockerignore file. For instance, if we want to ignore a folder called excluded-folder, our .dockerignore file should have:

    excluded-folder/
  3. Build our Docker image using the Dockerfile like we usually do. The folder we wrote in the .dockerignore file will not be sent to the Docker daemon. This means it will not be in the final image.

Example

Let’s say we have this folder structure:

my-app/
|-- Dockerfile
|-- .dockerignore
|-- app/
|   |-- file1.txt
|   |-- file2.txt
|-- excluded-folder/
|   |-- file3.txt

Our .dockerignore file would look like this:

excluded-folder/

When we run this command to build our Docker image:

docker build -t my-app .

The files in excluded-folder will not be part of the image.

Benefits of Using .dockerignore

  • Smaller Image Size: By leaving out unneeded files and folders, we keep our Docker images lighter.
  • Faster Builds: When we exclude files, Docker can build images quicker because there is less data to move and work with.
  • Cleaner Images: We only include the files we need in the image. This helps lower the risk of security problems from showing extra data.

Extra Tips

  • Make sure our .dockerignore file is in our version control system like Git. This keeps things the same across different environments.

  • We can use patterns in our .dockerignore file to match many files or folders. For example, to ignore all folders named temp, we can write:

    temp/

For more information about managing Docker images and what Dockerfile settings mean, we can read articles like this one on Docker image storage.

Solution 4 - Using Named Volumes with Custom Configuration

To manage Docker volumes better, we can use Named Volumes with custom settings. Named volumes are easy to handle because Docker manages them. This makes it simpler to exclude some folders and organize our volume management.

Steps to Create Named Volumes with Exclusions

  1. Define Named Volume in Docker Compose: First, we need to create a volume in the docker-compose.yml file. Named volumes let Docker handle where the storage goes. This helps us avoid conflicts and makes things easier.

    version: "3.8"
    services:
      app:
        image: your-image-name
        volumes:
          - app_data:/app/data
    volumes:
      app_data:

    This setup makes a named volume called app_data that links to the /app/data folder in the container.

  2. Container Configuration: If we want to exclude a folder (like /app/data/exclude_this), we can set our app to store data in a different way. We can also create symlinks in the container.

    For example, if the app writes to /app/data, we change it to write to another folder inside the named volume. We can also copy only what we need:

    mkdir -p /app/data/keep_this
    mkdir -p /app/data/temp
    # Copy necessary files
    cp -r /app/data/* /app/data/keep_this/
  3. Custom Entry Point: If we want more control, we can make a custom entry point script. This script will manage which folders to exclude when the container starts.

    We can create a script called entrypoint.sh:

    #!/bin/bash
    # Create necessary directories
    mkdir -p /app/data/keep_this
    # Exclude unwanted directories
    rm -rf /app/data/exclude_this
    # Execute the main command
    exec "$@"

    Then, we need to update our docker-compose.yml to use this entry point:

    version: "3.8"
    services:
      app:
        image: your-image-name
        volumes:
          - app_data:/app/data
        entrypoint: ["/app/entrypoint.sh"]
  4. Using Volume Drivers: If we want more features, we can use volume drivers. They let us control how volumes are managed more closely. For example, we can use a local driver with special settings.

    volumes:
      app_data:
        driver: local
        driver_opts:
          type: none
          device: /path/to/data
          o: bind

Benefits of Using Named Volumes

  • Data Persistence: Named volumes keep our data safe. They last longer than the container’s life, so we can use our data later.
  • Ease of Management: Docker makes creating and managing volumes easier, which cuts down on problems.
  • Isolation: Named volumes help keep data separate between containers. This makes it less hard to manage settings and needs.

For more info on managing Docker volumes, we can look at Docker Volumes. This solution gives us a simple and effective way to exclude folders while using Docker named volumes.

Solution 5 - Custom Entry Point Script to Manage Exclusions

A simple way to add a volume to Docker and skip a sub-folder is to make a custom entry point script. This method lets us manage files and folders when the container starts. We have full control over what we include or skip in the volume.

Steps to Implement a Custom Entry Point Script

  1. Create a Dockerfile
    First, we need to create a Dockerfile. Here, we will define our app and the entry point script.

    FROM your-base-image
    
    # Set the working directory
    WORKDIR /app
    
    # Copy your application files
    COPY . .
    
    # Copy the entry point script
    COPY entrypoint.sh /usr/local/bin/entrypoint.sh
    
    # Make the entry point script executable
    RUN chmod +x /usr/local/bin/entrypoint.sh
    
    # Set the entry point
    ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
  2. Create the Entry Point Script
    Next, we will create the entrypoint.sh script. This script will take care of skipping the sub-folder we want to exclude.

    #!/bin/bash
    
    # Exclude a specific sub-folder
    if [ -d "/app/excluded-subfolder" ]; then
        rm -rf /app/excluded-subfolder
    fi
    
    # Start your application
    exec "$@"

    In this script:

    • We check if the excluded sub-folder exists and remove it if it does.
    • Then, we run the command that was given to the script (which is the main application).
  3. Build the Docker Image
    To build our Docker image with these settings, we run this command in the terminal:

    docker build -t your-image-name .
  4. Run the Docker Container with Volume
    Now, we can run our Docker container. While doing this, we mount the volume we want and exclude the sub-folder like our entry point script does.

    docker run -v /host/path:/app your-image-name

Benefits of Using a Custom Entry Point Script

  • Flexibility: We can change the script easily to include or exclude different files or folders based on what we need.
  • Control: By managing exclusions when the container runs, we make sure the latest folder structure is used without changing our Docker image.

This way of using a custom entry point script is a great way to manage volume exclusions in Docker containers. For more info on Docker volumes, check out Docker Volumes.

Solution 6 - Using Overlay File System for Exclusion

We can use the Overlay File System to handle Docker volumes and leave out specific sub-folders. This method works by making an overlay that combines different layers of file systems. It lets us exclude certain directories from the mounted volume. Here’s how we can set it up:

Step 1: Create the Required Directory Structure

First, we need to create the directories for the overlay filesystem. For instance, we want to leave out the excluded_folder from our volume.

mkdir -p /path/to/overlay/upper
mkdir -p /path/to/overlay/work
mkdir -p /path/to/overlay/lower
## Conclusion

In this article, we looked at different ways to add a volume to Docker while leaving out some sub-folders. We talked about using Docker Compose, bind mounts, and the .dockerignore file. These methods help us manage our Docker volumes better.

Using these methods can make our work easier and improve our Docker setup. If we want to learn more about managing Docker, we can check out our guides on [Docker volumes](http://www.bestonlinetutorial.com/2025/01/docker-volumes.html) and [how to mount host directories in Docker](http://www.bestonlinetutorial.com/2025/01/solved-how-to-mount-host-directory-in.html).

Comments