DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

Mastering Dockerfile Syntax: A Complete Guide for Creating Custom Docker Images

Dockerfile Syntax: A Comprehensive Guide

A Dockerfile is a script containing a series of instructions on how to build a Docker image. Dockerfiles define the environment and configuration that Docker containers will run, specifying the base image, dependencies, environment variables, and commands to run in the container.

In this article, we will cover the essential syntax and instructions used in Dockerfiles to create custom Docker images for your applications.


1. What is a Dockerfile?

A Dockerfile is a text document containing a set of instructions that Docker uses to automate the building of images. Each instruction in the Dockerfile creates a layer in the resulting image. These layers are cached, enabling faster builds after the initial build. Dockerfiles allow you to specify everything required to set up your application inside a container.


2. Dockerfile Syntax Overview

The syntax for Dockerfiles consists of instructions, arguments, and comments. The most common Dockerfile instructions are:

  • FROM
  • RUN
  • COPY
  • ADD
  • CMD
  • ENTRYPOINT
  • EXPOSE
  • ENV
  • WORKDIR
  • VOLUME
  • USER
  • ARG
  • LABEL
  • HEALTHCHECK
  • STOPSIGNAL

3. Dockerfile Instructions

FROM

The FROM instruction defines the base image for your Docker image. It is the first instruction in any Dockerfile. You can specify an image from Docker Hub or a custom image.

Syntax:

FROM <image_name>:<tag>
Enter fullscreen mode Exit fullscreen mode

Example:

FROM ubuntu:20.04
Enter fullscreen mode Exit fullscreen mode

This instruction uses the Ubuntu 20.04 image as the base.

RUN

The RUN instruction allows you to execute commands inside the container at build time. It is typically used to install dependencies, packages, or perform any system setup needed for your application.

Syntax:

RUN <command>
Enter fullscreen mode Exit fullscreen mode

Example:

RUN apt-get update && apt-get install -y python3
Enter fullscreen mode Exit fullscreen mode

This command installs Python 3 inside the container during the build process.

COPY

The COPY instruction copies files or directories from the host system into the container's file system.

Syntax:

COPY <src> <dest>
Enter fullscreen mode Exit fullscreen mode

Example:

COPY ./myapp /usr/src/app
Enter fullscreen mode Exit fullscreen mode

This command copies the contents of the local myapp directory to the /usr/src/app directory in the container.

ADD

The ADD instruction is similar to COPY, but with some additional features. It can handle remote URLs, and it also automatically extracts tar archives.

Syntax:

ADD <src> <dest>
Enter fullscreen mode Exit fullscreen mode

Example:

ADD myapp.tar.gz /usr/src/app
Enter fullscreen mode Exit fullscreen mode

This command copies the myapp.tar.gz file into the container and extracts it at the specified destination.

CMD

The CMD instruction defines the default command that will be executed when the container starts. There can only be one CMD instruction in a Dockerfile. If more than one CMD is provided, only the last one will be used.

Syntax:

CMD ["executable", "param1", "param2"]
Enter fullscreen mode Exit fullscreen mode

or

CMD ["param1", "param2"]
Enter fullscreen mode Exit fullscreen mode

or

CMD <command>
Enter fullscreen mode Exit fullscreen mode

Example:

CMD ["python3", "app.py"]
Enter fullscreen mode Exit fullscreen mode

This will run the app.py file using Python when the container starts.

ENTRYPOINT

The ENTRYPOINT instruction allows you to specify the executable that will always run when the container starts. Unlike CMD, ENTRYPOINT cannot be overridden by passing a different command when running the container, although it can be combined with CMD.

Syntax:

ENTRYPOINT ["executable", "param1", "param2"]
Enter fullscreen mode Exit fullscreen mode

Example:

ENTRYPOINT ["python3", "app.py"]
Enter fullscreen mode Exit fullscreen mode

The ENTRYPOINT sets the default executable, and if the container is run with arguments, they are passed to this executable.

EXPOSE

The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. It does not map the ports to the host machine; it is just a documentation feature and a way for Docker to know which ports are intended to be opened.

Syntax:

EXPOSE <port>
Enter fullscreen mode Exit fullscreen mode

Example:

EXPOSE 8080
Enter fullscreen mode Exit fullscreen mode

This exposes port 8080 inside the container.

ENV

The ENV instruction sets an environment variable inside the container. This is useful for configuration values or secrets that the application might need.

Syntax:

ENV <key> <value>
Enter fullscreen mode Exit fullscreen mode

Example:

ENV APP_ENV=production
Enter fullscreen mode Exit fullscreen mode

This sets the APP_ENV variable to production.

WORKDIR

The WORKDIR instruction sets the working directory for subsequent RUN, CMD, ENTRYPOINT, COPY, and ADD instructions. It works similarly to cd in a shell.

Syntax:

WORKDIR /path/to/directory
Enter fullscreen mode Exit fullscreen mode

Example:

WORKDIR /usr/src/app
Enter fullscreen mode Exit fullscreen mode

This sets the working directory to /usr/src/app for the following instructions.

VOLUME

The VOLUME instruction creates a mount point with a specified path in the container’s file system. Volumes are used to persist data outside of the container.

Syntax:

VOLUME ["/path/to/directory"]
Enter fullscreen mode Exit fullscreen mode

Example:

VOLUME ["/data"]
Enter fullscreen mode Exit fullscreen mode

This creates a mount point at /data where data can be stored persistently.

USER

The USER instruction sets the user to use when running the container. This can improve security by running the container as a non-root user.

Syntax:

USER <username or UID>
Enter fullscreen mode Exit fullscreen mode

Example:

USER nobody
Enter fullscreen mode Exit fullscreen mode

This sets the user to nobody.

ARG

The ARG instruction defines build-time variables that can be passed at the time of building the Docker image.

Syntax:

ARG <name>[=<default_value>]
Enter fullscreen mode Exit fullscreen mode

Example:

ARG VERSION=1.0
Enter fullscreen mode Exit fullscreen mode

This sets the build argument VERSION to 1.0.


4. Dockerfile Example

Here's a simple Dockerfile example that combines several of the instructions mentioned:

# Use official Python image as base
FROM python:3.9-slim

# Set environment variable
ENV APP_ENV=production

# Set working directory
WORKDIR /usr/src/app

# Copy application files into the container
COPY . .

# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Expose the app port
EXPOSE 5000

# Set default command to run the app
CMD ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

In this Dockerfile:

  • The base image is Python 3.9.
  • The WORKDIR is set to /usr/src/app.
  • The application files are copied into the container.
  • Dependencies are installed using pip.
  • The application listens on port 5000.
  • The default command is to run app.py with Python.

5. Conclusion

Dockerfiles provide a powerful way to automate the creation of Docker images. Understanding the Dockerfile syntax and the various instructions will help you create custom Docker images tailored to your application’s requirements. Whether you are building a simple app or a complex microservices architecture, a well-written Dockerfile ensures a smooth and consistent development and deployment process.


Top comments (0)