Where do you place the application inside the Docker image?
In the past, when deploying Python/Django projects, we'd put them in
/srv/django-projects/APPNAME on a (possibly shared) machine. The
python-virtualenv that came with it, went into
Now that we're dockerizing many projects, we don't need the virtualenv (there is only one environment) and we don't need the APPNAME either (there is only one application). So, where should we place the project?
The usual suspects would be one of:
/usr/local — optionally suffixed by APPNAME. Other common paths are:
/app- is not in the Filesystem Hierarchy Standard (FHS). The advantage of this over other paths is that it is just one level deep and short.
/code- is not in the FHS either, but it is short. However it feels like it contains source code, not runnable code.
/usr/src/APPNAME- anything here feels to me like it still needs compilation and copying to a real location.
/usr/local/APPNAMEis inconveniently far away, and
/usr/local/src/APPNAMEsuffers from the same problem as
/opt/APPNAMEhas always been my preferred place to put pre-built binary packages (for example Java applications, or other closed-source binaries) that did not arrive through the package manager. Placing my own code here feels wrong.
/srvwould probably be my preferred location, because it's in the FHS and short enough, and empty. But on the other hand, it's not necessarily immediately clear that the application code resides here.
A quick scan of
Dockerfile examples yields this:
golang: /go/src/app [https://hub.docker.com/_/golang/] hylang: /usr/src/app [https://hub.docker.com/_/hylang/] perl: /usr/src/app [https://hub.docker.com/_/perl/] python: /app [https://docs.docker.com/get-started/part2/#your-new-development-environment] ruby: /app [https://github.com/buildkite/ruby-docker-example/blob/master/Dockerfile]
A quick Google search for the phrase
COPY . /PATH yields these counts:
26k: /app 25k: /usr/src/app 3k: /usr/src/APPNAME 2k: /usr/local/... 2k: /opt/APPNAME 1k: /code + /code/APPNAME 1k: /srv + /srv/APPNAME
COPY . /app wins hands down. If we turn a blind eye to the
FHS violation, this is the most common and best option. For golang
applications we may make an exception, since go is rather picky about