Dockerfile syntax
Documentation
official docs https://docs.docker.com/engine/reference/builder/
Usage
Images are created from dockerfiles using the build command.
docker build \ -f /path/to/Dockerfile \ -t <container_name> \ /path/for/container docker build . # if dockerfile in cwd # or you can use a directory # image-name/ # Dockerfile docker build image-name
Syntax
FROM
Every container starts with a from line. This indicates the base image that your container is built on top of.
FROM ubuntu:16.04
RUN
Commands that run when your container is being built for the first time.
RUN apt-get update && \ apt-get install python3-pipCMD
commands run every time your container is started.
CMD echo "welcome!" >> /home/user/welcome.txtADD
copy a file into your container.
Supports glob-style matching.ADD /path/file /path/file ADD Gemfile* /path/ ADD . /path/ ADD --chmod=user:user /path/file /path/fileENTRYPOINT
If you are creating a container to run a specific application, set that application to the
ENTRYPOINT
. This means that every time that your container is started, that application will run.ENTRYPOINT ['/usr/bin/firefox', '-private-window'] ## exec-style (best practice) ENTRYPOINT /usr/bin/firefox -private-window ## shell-style (discouraged, unix signals will be unavailable, your program will not be PID #1)If your entrypoint is a script, you can ensure that it is able to properly handle unix signals by using gosu and exec:
#!/bin/bash set -e if [ "$1" = 'postgres' ]; then chown -R postgres "$PGDATA" if [ -z "$(ls -A "$PGDATA")" ]; then gosu postgres initdb fi exec gosu postgres "$@" fi exec "$@"ENV
Set an environment variable in the container.
Once defined, they can be referred to as$VAR
ENV PYTHONPATH /home/dev/python ENV blah=$PYTHONPATHEXPOSE
Exposes a port inside the container to the host. (I am still unclear what interface the port is bound to... 127.0.0.1 ?)
Section Marked as Requiring Revision:
The official documentation says that expose does not actually forward container's ports, it only indicates that the container is listening on these ports. I need to test this to see what is actually happening when this command is used..
EXPOSE 8080 ## expose container's 8080 on host's 8080 EXPOSE 8080 9000 ## expose container's 8080 on host's 9000ARG
Arg allows you to submit arguments at build time.
It can be accessed later similarly to an environment variable.ARG VERSION ARG VERSION=DEFAULT_VALUE RUN echo $VERSIONdocker build --build-arg VERSION=1.1.1VOLUME
Defines mountpoint for a volume inside the container.
This is optionally bound withindocker run -v /src:/dst
.
If not defined, then a location will be created automatically.Volumes can be shared between containers.