Custom behaviour
Based on existing image
Adds tools and functionality
Simple but sufficient language
Create Dockerfile
:
$ cat >Dockerfile <<EOF
FROM ubuntu:20.04
RUN apt update && apt -y install nginx
EOF
Build image from Dockerfile
:
docker build --tag myimage .
–
$ cat >Dockerfile <<EOF
FROM openjdk:11-jre
CMD java -version
EOF
$ docker build --tag cmd .
$ docker run cmd
Many containerized services use environment variables for configuration:
$ cat >Dockerfile <<EOF
FROM postgres
ENV POSTGRES_PASSWORD=foobar
EOF
$ docker build --tag my_postgres .
$ docker run my_postgres
–
$ cat >Dockerfile <<EOF
FROM ubuntu
ARG VERSION=1.24.1
RUN apt-get update \
&& apt-get -y install --no-install-recommends curl ca-certificates
RUN curl --location --output /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-`uname -s`-`uname -m` \
&& chmod +x /usr/local/bin/docker-compose
CMD /usr/local/bin/docker-compose
EOF
$ docker build --build-arg VERSION=1.29.2 --tag docker-compose .
$ docker run docker-compose
–
Applies to RUN
, CMD
, ENTRPOINT
Shell notation wraps command in shell:
FROM openjdk:11-jre
CMD java -version
…is equivlent to…
docker run -it openjdk:11-jre sh -c 'java version'
Exec notation starts process without shell:
FROM openjdk:11-jre
CMD [ "java", "-version" ]
Equivalent to…
docker run -it openjdk:11-jre java -version
–
ENTRYPOINT
hardcodes the process to run
CMD
defines parameters
Command line overrides CMD
$ cat >Dockerfile <<EOF
FROM openjdk:11-jre
ENTRYPOINT [ "java" ]
CMD [ "-version" ]
EOF
$ docker build --tag java .
$ docker run -it java -help
–
Create Dockerfile
$ cat >Dockerfile <<EOF
FROM ubuntu
ARG VERSION=1.29.2
RUN apt-get update \
&& apt-get -y install --no-install-recommends curl ca-certificates
RUN curl --location --output /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-`uname -s`-`uname -m` \
&& chmod +x /usr/local/bin/docker-compose
CMD /usr/local/bin/docker-compose
EOF
Build image and assign multiple tags:
docker build . \
--tag docker-compose:1.29.2 \
--tag docker-compose:1.29 \
--tag docker-compose:1
Assign alternative names:
docker tag docker-compose:1.29.2 docker-compose:latest