Docker uses the Dockerfile to build docker images, but what if you want to change the name and (or) the path of this file?
By default “docker build” command uses a file named Dockerfile on the same directory you execute the “docker build“. There is an option to change the path and name of this special file:
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
And the “-f” may include path and file name but it is mandatory to specify the path at the end “docker build” usually the current directory (context by the docker terminology) by adding “.” (the dot at the end of the command)
So if you want to build with a docker file mydockerfile in the current directory you must execute:
docker build -f mydockerfile .
If your file is in a sub-directory execute:
docker build -f subdirectory/mydockerfile .
The command will create a docker image in your local repository. Here is the output of the first command:
root@srv:~/docker# docker build -f mydockerfile . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:bionic-20191029 bionic-20191029: Pulling from library/ubuntu 7ddbc47eeb70: Pull complete c1bbdc448b72: Pull complete 8c3b70e39044: Pull complete 45d437916d57: Pull complete Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d Status: Downloaded newer image for ubuntu:bionic-20191029 ---> 775349758637 Step 2/3 : MAINTAINER test@example.com ---> Running in 5fa42bca749c Removing intermediate container 5fa42bca749c ---> 0a1ffa1728f4 Step 3/3 : RUN apt-get update && apt-get upgrade -y && apt-get install -y git wget ---> Running in 2e35040f247c Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] ..... ..... Processing triggers for ca-certificates (20180409) ... Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done. Removing intermediate container 2e35040f247c ---> 2382809739a4 Successfully built 2382809739a4
Here is the image:
REPOSITORY TAG IMAGE ID CREATED SIZE root@srv:~# docker images <none> <none> 2382809739a4 About a minute ago 186MB
Build command with custom name and registry URL and TAG
root@srv:~# docker build -t gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base:v0.1 -f mydockerfile . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:bionic-20191029 ---> 775349758637 Step 2/3 : MAINTAINER test@example.com ---> Using cache ---> 0a1ffa1728f4 Step 3/3 : RUN apt-get update && apt-get upgrade -y && apt-get install -y git wget ---> Using cache ---> 2382809739a4 Successfully built 2382809739a4 Successfully tagged gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base:v0.1 root@srv:~# docker push gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base:v0.1 The push refers to repository [gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base] 7cebba4bf6c3: Pushed e0b3afb09dc3: Pushed 6c01b5a53aac: Pushed 2c6ac8e5063e: Pushed cc967c529ced: Pushed v0.1: digest: sha256:acf42078bf46e320c402f09c6417a3dae8992ab4f4f685265486063daf30cb13 size: 1364
the registry URL is “gitlab.ahelpme.com:4567” and the project path is “/root/ubuntu-project/” and the name of the image is “ubuntu18-manual-base” with tag “v0.1“. The build command uses the cache from our first build example here (because the docker file is the same).
Typical errors with “-f”
Two errors you may encounter when trying the “-f” to change the name of the default Dockerfile name:
$ docker build -t gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base:v0.1 -f mydockerfile subdirectory/ unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /builds/dev/docker-containers/mydockerfile: no such file or directory $ docker build -t gitlab.ahelpme.com:4567/root/ubuntu-project/ubuntu18-manual-base:v0.1 -f subdirectory/mydockerfile "docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | -
First, you might think the -f would take the path and file name and this should be enough, but the errors above appears!
Our example Dockerfile
This is our simple example docker file:
FROM ubuntu:bionic-20191029 MAINTAINER test@example.com RUN apt-get update && apt-get upgrade -y && apt-get install -y git wget
We are using the official docker image from Ubuntu. Always use official docker images!