Are you looking to create your own Docker image? The docker images are the basic software applications or an operating system but when you need to create software with advanced functionalities of your choice, then consider creating a new docker image with dockerfile.
In this tutorial, you will learn how to create your own Docker Image using dockerFile, which contains a set of instructions and arguments again each instruction. Let’s get started.
If you’d like to follow along step-by-step, you will need the following installed:
- Ubuntu machine with Docker installed. This tutorial uses Ubuntu 21.10 machine.
- Docker v19.03.8 installed.
What is Dockerfile?
If you are new to dockerfile, you should know what dockerfile is. Dockerfile is a text file that contains all the instructions a user could call on the command line to assemble an image from a base image. The multiple instructions could be using the base image, updating the repository, Installing dependencies, copying source code, etc.
Docker can build images automatically by reading the instructions from a Dockerfile. Each instruction in DockerFile creates another layer (All the instructions take their own memory). While building the new image using the docker build command ( which is done by Docker daemon), if any instruction fails and if you rebuild the image, then previous instructions which are cached are used to build.
New Docker image can be built using simply executing docker build command, or if you need to build docker image from a different path use
docker build .
docker build -f /path/to/a/Dockerfile .
Dockerfile instructions or Dockerfile Arguments
- FROM : From instruction initializes new build stage and sets the base image for subsequent instructions. From instruction may appear multiple times in the dockerFile.
- ARG: ARG is the only instruction that comes before FROM. The
ARGinstruction defines a variable that users can pass while building the image using the
docker buildcommand such as
--build-arg <varname>=<value> flag
- EXPOSE: Expose instruction informs docker about the port’s container listens on. The
EXPOSEinstruction does not actually publish the port.; it is just for the sake of understanding for admins to know about which ports are intended to be published
- ENV: The
ENVinstruction sets the environment variable in the form of
- ADD: The
ADDinstruction copies new files, directories, or remote file URLs from your docker host and adds them to the filesystem of the image.
- LABELS: The LABEL instruction adds information or label to an image.
- VOLUME: The
VOLUMEinstruction creates a mount point and acts as externally mounted volumes from the docker host or other containers.
- RUN: The
RUNinstruction will execute any commands in a new layer on top of the current image and commit the results. RUN are declared in two ways, either shell way or executable way.
- Shell way: the command is run in a shell i.e.,/bin/sh. If you need to run multiple commands, use the backslash.
- Executable way: RUN [“executable”, “param1”, “param2”] . If you need to use any other shell than /bin/sh, you should consider using executable.
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' # Shell way
RUN ["/bin/bash", "-c", "echo HOME"] # Executable way (other than /bin/sh)
- CMD: The
CMDinstruction execute the command within the container just like docker run exec command. There can be only one CMD instruction in DockerFile. If you list more than one then last will take effect. CMD has also three forms as shown below
CMD ["executable","param1","param2"](exec form, this is the preferred form)
CMD ["param1","param2"](as default parameters to ENTRYPOINT)
CMD command param1 param2(shell form)
Let’s take an example in the below docker file; if you need that your container should sleep for 5 seconds and then exists, use the below command.
FROM Ubuntu CMD sleep 5
Run the below docker run command to create a container, and then it sleeps for 5 seconds, and then the container exists.
docker run <new-image>
But If you wish to modify the sleep time such as 10 then either you will need to either change the value manually in the Dockerfile or add the value in the docker command.
FROM Ubuntu CMD sleep 10 # Manually changing the sleep time in dockerfile
docker run <new-image> sleep 10 # Manually changing the sleep time in command line
You can also use the entry point shown below to automatically add the sleep command in the running docker run command, where you just need to provide the value of your choice.
FROM Ubuntu ENTRYPOINT ["sleep"]
With Entrypoint, when you execute the docker run command with a new image, sleep will automatically get appended in the command as shown below. Still, the only thing you need to specify is the number of seconds it should sleep.
docker run <new-image> sleep <add-value-of-your-choice>
So in case of CMD command instruction command line parameters passed are completely replaced where in case of entrypoint parameters passed are appended.
If you don’t provide the <add-value-of-your-choice>, this will result in an error. To avoid the error, you should consider using both CMD and ENTRYPOINT but make sure to define both CMD and ENTRYPOINT in json format.
FROM Ubuntu ENTRYPOINT sleep # This command will always run sleep command CMD ["5"] # In case you pass any parameter in command line it will be picked else 5 by default
- ENTRYPOINT: An
ENTRYPOINTallows you to run the commands as an executable in a container. ENTRYPOINT is preferred when defining a container with a specific executable. You cannot override an ENTRYPOINT when starting a container unless you add the
Up to now, you learned how to declare dockerfile instructions and executable of each instruction, but unless you create a dockerfile and build a new image with these commands, they are not doing much. So let’s learn and understand by creating a new dockerfile. Let’s begin.
- Login to the ubuntu machine using your favorite SSH client.
- Create a folder under home directory named dockerfile-demo and switch to this directory.
mkdir ~/dockerfile-demo cd dockerfile-demo/
- Create a file inside the ~/dockerfile-demo directory named dockerfile and copy/paste the below code. Below code contains from instruction which sets the base image as ubuntu and runs the update and nginx installation commands and builds the new image. Once you run the docker containter then Image created is printed on the screen on containers terminal using echo command.
FROM ubuntu:20.04 MAINTAINER email@example.com RUN apt-get update RUN apt-get install nginx CMD [“echo”,”Image created”]
- Now build the docker image by using docker build command.
docker build -t docker-image:tag1 .
As you can see below, once the docker container is started, the Image created is printed on the container’s screen.
In this tutorial, you learned what is dockerfile, a lot of dockerfile instructions and executables, and finally, how to create your own Docker Image using dockerFile.
So which application are you planning to run using the newly created docker image?