What is Dockerfile ARG?

The ARG instruction in a Dockerfile defines a variable that users can pass at build-time to the builder with the docker build command. It allows for more flexible image builds by parameterizing certain values. Unlike ENV, ARG values are not persisted in the final image.

The Dockerfile ARG instruction is a key component in the world of containerization and orchestration. It is used to define variables that users can pass at build-time to the builder with the docker build command. This article aims to provide a comprehensive understanding of Dockerfile ARG, its history, its use cases, and specific examples of its application.

Containerization and orchestration are fundamental concepts in modern software development and deployment. Containerization involves packaging an application along with its dependencies into a container, which can then be run on any system. Orchestration, on the other hand, involves managing these containers to ensure they work together seamlessly. Dockerfile ARG plays a crucial role in both these processes.

Definition of Dockerfile ARG

The Dockerfile ARG instruction is a command used in a Dockerfile, which is a text document containing all the commands required to build a Docker image. The ARG instruction defines a variable that users can pass to the builder at build-time. This variable is not preserved in the final image, making it a temporary environment variable only available during the build process.

The syntax for the ARG instruction is ARG [=]. The name represents the name of the variable, and the default value is an optional parameter that sets a default value for the variable if it is not provided at build-time. If a user does not provide a value for the variable at build-time, Docker uses the default value.

Understanding Dockerfile ARG

Understanding Dockerfile ARG requires a basic understanding of Docker and its components. Docker is an open-source platform that automates the deployment, scaling, and management of applications. It uses containerization to package an application and its dependencies into a standardized unit for software development.

Dockerfile ARG is a critical part of this process. It allows developers to pass variables at build-time, which can be used to customize the build process. For example, a developer might use an ARG instruction to pass a version number to the builder, which can then be used to pull a specific version of a base image.

How Dockerfile ARG Works

The Dockerfile ARG instruction works by defining a variable that can be passed to the builder at build-time. When a Dockerfile is run with the docker build command, Docker reads the Dockerfile and executes the instructions in the order they appear in the file. If an ARG instruction is encountered, Docker defines a variable with the specified name and optional default value.

Once the variable is defined, it can be referenced in other instructions in the Dockerfile using the syntax $. For example, if an ARG instruction defines a variable named VERSION, it can be referenced in other instructions as $VERSION. This allows developers to customize the build process based on the values of these variables.

History of Dockerfile ARG

The ARG instruction was introduced in Docker 1.9, released in November 2015. This release marked a significant milestone in Docker's history, as it introduced several new features and improvements, including the ARG instruction. The introduction of the ARG instruction was a response to the growing demand for more flexibility and customization in the Docker build process.

Since its introduction, the ARG instruction has become a staple in Dockerfiles around the world. It has enabled developers to create more flexible and customizable Docker images, which has in turn led to more efficient and scalable applications. Despite its relative simplicity, the ARG instruction has had a significant impact on the world of containerization and orchestration.

Evolution of Dockerfile ARG

Since its introduction, the ARG instruction has remained relatively unchanged. However, its usage has evolved as developers have found new and innovative ways to use it. For example, some developers use ARG instructions to pass sensitive information, such as API keys or passwords, to the builder. This allows them to keep this information out of the Dockerfile and the final image, enhancing the security of their applications.

Another evolution in the use of the ARG instruction is its combination with the ENV instruction. The ENV instruction sets a persistent environment variable that is preserved in the final image and can be used by the application at runtime. By using an ARG instruction to pass a value at build-time and an ENV instruction to set it as a persistent environment variable, developers can pass values from the build process to the application at runtime.

Use Cases of Dockerfile ARG

The Dockerfile ARG instruction is used in a variety of scenarios in containerization and orchestration. One of the most common use cases is to pass version numbers to the builder. This allows developers to build Docker images with specific versions of base images or dependencies, which can be crucial for ensuring compatibility and stability.

Another common use case is to pass sensitive information, such as API keys or passwords, to the builder. This allows developers to keep this information out of the Dockerfile and the final image, enhancing the security of their applications. However, it's important to note that this information can still be exposed in the build logs, so it's not a foolproof method of securing sensitive information.

Passing Version Numbers

Passing version numbers to the builder is one of the most common use cases of the Dockerfile ARG instruction. This is done by defining an ARG instruction with a variable for the version number, and then referencing this variable in the FROM instruction to pull a specific version of a base image.

For example, a Dockerfile might include the instructions ARG VERSION=1.0 and FROM ubuntu:$VERSION. When this Dockerfile is run with the docker build command, Docker will pull the version 1.0 of the Ubuntu base image. If a different version is required, the developer can pass a different value for the VERSION variable at build-time.

Passing Sensitive Information

Another common use case of the Dockerfile ARG instruction is to pass sensitive information to the builder. This is done by defining an ARG instruction with a variable for the sensitive information, and then referencing this variable in other instructions that require this information.

For example, a Dockerfile might include the instructions ARG API_KEY and RUN echo $API_KEY > /api_key. When this Dockerfile is run with the docker build command, Docker will write the value of the API_KEY variable to a file named /api_key in the image. This allows the application to access the API key at runtime without including it in the Dockerfile or the final image.

Examples of Dockerfile ARG

Let's look at some specific examples of how the Dockerfile ARG instruction can be used. These examples will demonstrate how ARG can be used to pass version numbers and sensitive information to the builder, as well as how it can be combined with the ENV instruction to pass values from the build process to the application at runtime.

Consider a Dockerfile that includes the instructions ARG VERSION=1.0 and FROM ubuntu:$VERSION. When this Dockerfile is run with the docker build command, Docker will pull the version 1.0 of the Ubuntu base image. If a different version is required, the developer can pass a different value for the VERSION variable at build-time with the command docker build --build-arg VERSION=2.0 .

Passing Version Numbers Example

Consider a Dockerfile that includes the following instructions:


ARG VERSION=1.0
FROM ubuntu:$VERSION

When this Dockerfile is run with the docker build command, Docker will pull the version 1.0 of the Ubuntu base image. If a different version is required, the developer can pass a different value for the VERSION variable at build-time with the command docker build --build-arg VERSION=2.0 .

Passing Sensitive Information Example

Consider a Dockerfile that includes the following instructions:


ARG API_KEY
RUN echo $API_KEY > /api_key

When this Dockerfile is run with the docker build command, Docker will write the value of the API_KEY variable to a file named /api_key in the image. This allows the application to access the API key at runtime without including it in the Dockerfile or the final image. The API key can be passed at build-time with the command docker build --build-arg API_KEY=myapikey .

Combining ARG and ENV Example

Consider a Dockerfile that includes the following instructions:


ARG VERSION=1.0
ENV VERSION=$VERSION
FROM ubuntu:$VERSION

When this Dockerfile is run with the docker build command, Docker will pull the version 1.0 of the Ubuntu base image and set the VERSION environment variable to 1.0. This allows the application to access the version number at runtime. If a different version is required, the developer can pass a different value for the VERSION variable at build-time with the command docker build --build-arg VERSION=2.0 .

Conclusion

The Dockerfile ARG instruction is a powerful tool in the world of containerization and orchestration. It allows developers to pass variables at build-time, which can be used to customize the build process. This can be particularly useful for passing version numbers and sensitive information to the builder, as well as for passing values from the build process to the application at runtime.

Despite its relative simplicity, the ARG instruction has had a significant impact on the world of containerization and orchestration. It has enabled developers to create more flexible and customizable Docker images, which has in turn led to more efficient and scalable applications. As Docker continues to evolve, the ARG instruction will undoubtedly continue to play a crucial role in the Docker build process.

High-impact engineers ship 2x faster with Graph
Ready to join the revolution?
High-impact engineers ship 2x faster with Graph
Ready to join the revolution?

Do more code.

Join the waitlist