Reputation: 7374
What is the best practices for getting code into a docker container?
Here are some possible approaches:
Upvotes: 5
Views: 3729
Reputation: 879
Usually, we use mount
for dev/local environment with docker to have the code changes instantly applied.
You can use RUN git clone
but you will need to install git and have access to the repository.
The easiest and most used/recommended way is putting the Dockerfile inside your repo and use the ADD
call. But use the COPY
directive instead because it’s more explicit
Upvotes: 5
Reputation: 158996
You should always COPY
your application code in the Dockerfile. You generally shouldn't mount something over that, and you almost definitely shouldn't run git
in your Dockerfile.
Running Git has a number of obvious issues. You can only build whatever specific commit the Dockerfile mentions; in real development it's not unusual to want to build a branch or a past commit. You need to install both git
itself and relevant credentials in the image, with corresponding space and security issues. Docker layer caching means that docker build
by default won't repeat a git clone
step if it thinks it's already done that, which means you need to go out of your way to get a newer build.
It's very common in SO questions to mount code into a container. This very much defeats the point of Docker, IMHO. If you go to run your application in production you want to just distribute the image and not also separately distribute its code, but if you've been developing in an environment where you always hide the code built into the image, you've never actually run the image itself. There are also persistent performance and consistency problems in various environments. I don't really recommend docker run -v
or Docker Compose volumes:
as a way of getting code into a container.
I've seen enough SO questions that have a Dockerfile that's essentially just FROM python
, for example, and then use Docker Compose volumes:
and command:
options to get a live-development environment on top of that. It's much easier to just install Python, and have the tools you need right in front of you without needing to go through a complex indirection sequence to run them in Docker.
Upvotes: 5