Mounting a shared volume on a docker image

Yesterday I needed a php 5.6 environment. Locally I'm running 7.0. First thought was to brew install php56, unlink php7 and link php56, but this proved a bit more complex than expected.

Attempting to install php56 through brew was resulting in:

Error: /usr/local/opt/php56 is not a valid keg.

After 20 minutes of troubleshooting I decided that a more effective use of my time would be to get on the docker train.

"No problem", I thought. I'd pull any one of the thousands of docker images already setup with ubuntu or alpine and php56, add a shared volume (my source code directory), and I'm off.

I installed Docker Dommunity Edition for Mac, jumped into Kitematic, found an image that matched my requirements (thanks, jolicode), ran:

docker pull jolicode/php56

and saw it show up in Kitematic. Jumped into the container settings-> Volumes and... Nothing. There's no way to add a new volume.

Not so easy. Unless the Dockerfile has an explicitly defined VOLUME entry, Kitematic will not display any actions.

Being that I want nothing to do with creating or maintaining a Dockerfile, and instead only want to quickly piggyback on someone else's public container, I was surprised to find no easy answer to my usecase. Eventually I came across a stackoverflow with some relevant info.

http://stackoverflow.com/a/28302411/110029

For now yes, the only way is recreation. See Docker Pull Request 8484 for when we can expect the dynamic adding functionality.

http://stackoverflow.com/a/33956387/110029

You can commit your existing container then run it with your new mounts.

This is the magic I was looking for.

docker ps -a // Show list of recently run containers

docker commit <container id> <new name of container> // create a new image from a container's changes

docker run -ti -v <path to local src dir>":<path to docker mounted dir> <new name of container> /bin/bash // Run the new image with the shared volume