0% found this document useful (0 votes)
40 views

Use Bind Mounts Docker Docs

1) A bind mount allows sharing of files between the host machine and a Docker container by mounting a host directory into the container. 2) An example demonstrates creating a bind mount by running an Ubuntu container with the current working directory mounted to /src inside the container. Changes made to files inside or outside the container are immediately visible. 3) For development, bind mounts allow mounting the source code directory into the container so changes are visible without rebuilding, and tools like nodemon can automatically restart processes when files change.

Uploaded by

Ramaroson Josoa
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
40 views

Use Bind Mounts Docker Docs

1) A bind mount allows sharing of files between the host machine and a Docker container by mounting a host directory into the container. 2) An example demonstrates creating a bind mount by running an Ubuntu container with the current working directory mounted to /src inside the container. Changes made to files inside or outside the container are immediately visible. 3) For development, bind mounts allow mounting the source code directory into the container so changes are visible without rebuilding, and tools like nodemon can automatically restart processes when files change.

Uploaded by

Ramaroson Josoa
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

Use bind mounts | Docker Docs https://docs.docker.

com/get-started/06_bind_mounts/

Guides / Get started / Getting started guide / Part 6: Use bind mounts

In part 5, you used a volume mount to persist the data in your database. A volume mount is
a great choice when you need somewhere persistent to store your application data.

A bind mount is another type of mount, which lets you share a directory from the host's
�lesystem into the container. When working on an application, you can use a bind mount to
mount source code into the container. The container sees the changes you make to the
code immediately, as soon as you save a �le. This means that you can run processes in the
container that watch for �lesystem changes and respond to them.

Give feedback
In this chapter, you'll see how you can use bind mounts and a tool called nodemon to
watch for �le changes, and then restart the application automatically. There are equivalent
tools in most other languages and frameworks.

Quick volume type comparisons


The following table outlines the main di�erences between volume mounts and bind mounts.

Host Docker chooses You decide


location

Mount type=volume,src=my-volume,target=/usr/local/data type=bind,src=/path/to/data,target=


example
(using
--mount

Populates Yes No
new

1 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

volume
with
container
contents

Supports Yes No
Volume
Drivers

Trying out bind mounts


Before looking at how you can use bind mounts for developing your application, you can run
a quick experiment to get a practical understanding of how bind mounts work.

Give feedback
If you use Windows and want to use Git Bash to run Docker commands, see Working
with Git Bash for syntax di�erences.

1. Verify that your getting-started-app directory is in a directory de�ned in Docker


Desktop's �le sharing setting. This setting de�nes which parts of your �lesystem you
can share with containers. For details about accessing the setting, see the topic for
Mac, Windows, or Linux.

2. Open a terminal and change directory to the getting-started-app directory.

3. Run the following command to start bash in an ubuntu container with a bind mount.

Mac / Linux Windows (PowerShell) Windows (Command Prompt)

$ docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash

The --mount option tells Docker to create a bind mount, where src is the current
working directory on your host machine ( getting-started-app ), and target is

2 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

where that directory should appear inside the container ( /src ).

4. After running the command, Docker starts an interactive bash session in the root
directory of the container's �lesystem.

root@ac1237fad8db:/# pwd
/
root@ac1237fad8db:/# ls
bin dev home media opt root sbin srv tmp var
boot etc lib mnt proc run src sys usr

5. Change directory to the src directory.

This is the directory that you mounted when starting the container. Listing the contents
of this directory displays the same �les as in the getting-started-app directory on
your host machine.

Give feedback
root@ac1237fad8db:/# cd src
root@ac1237fad8db:/src# ls
Dockerfile node_modules package.json spec src yarn.lock

6. Create a new �le named myfile.txt .

root@ac1237fad8db:/src# touch myfile.txt


root@ac1237fad8db:/src# ls
Dockerfile myfile.txt node_modules package.json spec src yarn.lock

7. Open the getting-started-app directory on the host and observe that the
myfile.txt �le is in the directory.

├── getting-started-app/
│ ├── Dockerfile
│ ├── myfile.txt
│ ├── node_modules/
│ ├── package.json
│ ├── spec/
│ ├── src/

3 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

│ └── yarn.lock

8. From the host, delete the myfile.txt �le.

9. In the container, list the contents of the app directory once more. Observe that the �le
is now gone.

root@ac1237fad8db:/src# ls
Dockerfile node_modules package.json spec src yarn.lock

10. Stop the interactive container session with Ctrl + D .

That's all for a brief introduction to bind mounts. This procedure demonstrated how �les are
shared between the host and the container, and how changes are immediately re�ected on
both sides. Now you can use bind mounts to develop software.

Development containers

Give feedback
Using bind mounts is common for local development setups. The advantage is that the
development machine doesn’t need to have all of the build tools and environments installed.
With a single docker run command, Docker pulls dependencies and tools.

Run your app in a development container


The following steps describe how to run a development container with a bind mount that
does the following:

• Mount your source code into the container

• Install all dependencies

• Start nodemon to watch for �lesystem changes

You can use the CLI or Docker Desktop to run your container with a bind mount.

CLI (Mac / Linux) CLI (Windows) Docker Desktop

4 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

1. Make sure you don't have any getting-started containers currently running.

2. Run the following command from the getting-started-app directory.

$ docker run -dp 127.0.0.1:3000:3000 \


-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
sh -c "yarn install && yarn run dev"

The following is a breakdown of the command:

• -dp 127.0.0.1:3000:3000 - same as before. Run in detached (background)

mode and create a port mapping

• -w /app - sets the "working directory" or the current directory that the command

will run from

• --mount type=bind,src="$(pwd)",target=/app - bind mount the current

Give feedback
directory from the host into the /app directory in the container

• node:18-alpine - the image to use. Note that this is the base image for your app

from the Docker�le

• sh -c "yarn install && yarn run dev" - the command. You're starting a shell

using sh (alpine doesn't have bash ) and running yarn install to install
packages and then running yarn run dev to start the development server. If you
look in the package.json , you'll see that the dev script starts nodemon .

3. You can watch the logs using docker logs <container-id> . You'll know you're ready
to go when you see this:

5 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

$ docker logs -f <container-id>


nodemon -L src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

When you're done watching the logs, exit out by hitting Ctrl + C .

Develop your app with the development container


Update your app on your host machine and see the changes re�ected in the container.

Give feedback
1. In the src/static/js/app.js �le, on line 109, change the "Add Item" button to simply
say "Add":

- {submitting ? 'Adding...' : 'Add Item'}


+ {submitting ? 'Adding...' : 'Add'}

Save the �le.

2. Refresh the page in your web browser, and you should see the change re�ected almost
immediately because of the bind mount. Nodemon detects the change and restarts the
server. It might take a few seconds for the Node server to restart. If you get an error, try
refreshing after a few seconds.

6 of 7 2/26/24, 12:29
Use bind mounts | Docker Docs https://docs.docker.com/get-started/06_bind_mounts/

3. Feel free to make any other changes you'd like to make. Each time you make a change
and save a �le, the change is re�ected in the container because of the bind mount.
When Nodemon detects a change, it restarts the app inside the container automatically.
When you're done, stop the container and build your new image using:

$ docker build -t getting-started .

Summary
At this point, you can persist your database and see changes in your app as you develop
without rebuilding the image.

In addition to volume mounts and bind mounts, Docker also supports other mount types and
storage drivers for handling more complex and specialized use cases.

Related information:

Give feedback
docker CLI reference

Product o�erings Pricing About us Support Contribute

Copyright © 2013-2024 Docker Inc. All rights reserved.

Terms of Service Status Legal

7 of 7 2/26/24, 12:29

You might also like