Docker Tip #12: A Much Better Development Experience with Volumes
If you're creating apps written in dynamic languages such as Ruby, Python or Node then you should be using volumes in development.
The idea of having to build a new Docker image every time you make a change to your app’s code base doesn’t seem very productive. Even with Docker’s superb ability to cache image layers so that it only updates what changed, it would still be annoying to re-build constantly.
Lucky for us, we can use volumes to mount in our app code directly into a running container. This way if we update our code base, then the changes will take effect immediately.
This is what will give you real-time updates and create a development experience that rivals the speed of what you would get without Docker (with the added win of using Docker).
You can also get the best of both worlds by using
COPY in a
Dockerfile like usual, but then when it comes time to running your containers in development, you simply add the volume flag to match
COPY’s path which will override whatever you copied in.
For example, here’s a trimmed down snippet that shows only what we talked about:
# Dockerfile # Business like usual, copying in files to the Docker image. COPY . /app
# docker-compose.yml services: app: # Mount the current directory into `/app` inside the running container. volumes: - '.:/app'
Now you get the portability benefits of using
COPY (which creates self contained Docker images that you can distribute to other machines) in production, and at the same time, you get a speedy development environment. It’s a win win.