Question

I am working on a website powered by Node. So I have made a simple Dockerfile that adds my site's files to the container's FS, installs Node and runs the app when I run the container, exposing the private port 80.

But if I want to change a file for that app, I have rebuild the container image and re-run it. That takes some seconds.

Is there an easy way to have some sort of "live sync", NFS like, to have my host system's app files be in sync with the ones from the running container?

This way I only have to relaunch it to have changes apply, or even better, if I use something like supervisor, it will be done automatically.

Was it helpful?

Solution

You can use volumes in order to do this. You have two options:

  1. Docker managed volumes:

    docker run -v /src/path nodejsapp
    docker run -i -t -volumes-from <container id> bash
    

The file you edit in the second container will update the first one.

  1. Host directory volume:

    docker run -v `pwd`/host/src/path:/container/src/path nodejsapp
    

The changes you make on the host will update the container.

OTHER TIPS

If you are under OSX, those kind of volume shares can become very slow, especially with node-based apps ( a lot of files ). For this issue, http://docker-sync.io can help, by providing a volume-share like synchronisation, without using volume shares, this usually speeds up your container read/write speed of the code-directory from 50-80 times, depending on what docker-machine you use.

For performance see https://github.com/EugenMayer/docker-sync/wiki/4.-Performance and for easy examples how to use it, see the boilerplates https://github.com/EugenMayer/docker-sync-boilerplate for your case the unison example https://github.com/EugenMayer/docker-sync-boilerplate/tree/master/unison is the one you would need for NFS like sync

docker run -dit -v ~/my/local/path:/container/path/ myimageId

For /container/path/ you could use for instance /usr/src/app. The flags:

-d = detached mode,

-it = interactive,

-v + paths = specifies the volume.

(If you just care about the volume, you can drop the -dit flag.)

Docker run reference

I use Scaffold's File Sync functionality for this. It gets the job done, and without needing overly complex configuration.

Setting up Scaffold in my project was as simple as installing Skaffold (through chocolatey, since I'm on Windows), running skaffold init --generate-manifests in my project folder, and answering a couple questions it asked.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top