Friday, September 23, 2022
HomeWeb DevelopmentDockerizing your Go utility - LogRocket Weblog

Dockerizing your Go utility – LogRocket Weblog


On this submit, we’re going to discover ways to Dockerize a Go utility. Particularly, we’re going to discover ways to set up Go inside a Docker container through a file, referred to as the Dockerfile. To not fear — we’ll study extra about Dockerfiles as we proceed.

Should you’re not acquainted, Go is an open supply, statically typed, compiled programming language that allows you to construct easy, dependable, and environment friendly software program. It’s used to construct net apps, cloud-native purposes, CLIs, and so forth — even Docker is written in Go!

We’ll create a minimal Go challenge for demo functions and present the right way to expose native folders contained in the Docker container for simple growth. That is in order that we shouldn’t have to rebuild the Docker container each time we make a change in our Go app.

Leap forward:

Benefits of Dockerizing your apps

Docker is an open-source challenge that permits builders to bundle their purposes with all mandatory dependencies, configurations, scripts, and many others. inside that container and deploy it as a single entity. This simply automates the deployment of purposes inside an surroundings, referred to as a container, and permits these purposes to simply run on any host working system.

The benefit of this strategy is that, as a substitute of deploying our purposes inside digital machines, which include some bottlenecks regarding the accessible OS, you deploy inside a Docker container, which is extra environment friendly as a result of it may possibly use a single host (on this case, a Linux working system with all its underlying sources) to serve our purposes. With this strategy, we don’t should care how or the place we deploy our utility as a result of we now not have to contemplate the goal OS.

As an example, digital machines run purposes inside a visitor OS. Containers, however, supply us a sandboxed strategy to bundle our utility and summary it from the surroundings during which it really runs, i.e., the host. This enables purposes constructed with Docker to be simply deployed, no matter the goal OS. Due to this fact, it’s simpler for builders to create purposes that may run anyplace and could be positive they run with out concern as a result of they’re remoted from the remainder of the host OS processes.


For this submit, all we now have to be accustomed to is a fundamental utilization of the command line and a textual content editor and we needs to be good to go. Prior expertise in creating net purposes with Go shall be useful, however shouldn’t be completely required. To get began with Go, please try this hyperlink from the documentation.

Lastly, please create an account on DockerHub and set up it in your growth machine based mostly in your working system of alternative.

Establishing our growth surroundings

To proceed we have to set up the next based mostly on our working system.

On this submit, we’ll be utilizing macOS. After downloading Go, click on the .pkg file, extract the Go bundle in your system path, and set up Go. As soon as Go is put in, we are able to verify the model by working the next command in our terminal:

Confirm your Go version using this command

After that, proceed to obtain and set up the Docker desktop in your native machine. A picture of the Docker desktop after set up is proven beneath.

The Docker desktop view after installation

Additionally, to verify we now have Docker put in on our system, we are able to run the next command:

docker --version

Confirm the Docker version using this command

Subsequent, allow us to proceed to bootstrap a minimal Go utility, since for this submit, our focus shouldn’t be on studying Go. To start, create a brand new folder and title it go-demo on any path in your native machine.

Extra nice articles from LogRocket:

mkdir go-docker-demo

Navigate into the listing.

cd go-docker-demo

Run the next command to spin up a brand new Go module:

go mode init go-docker-demo

Output of creating a new Go module

Open the folder in your code editor. Inside our challenge folder, create a file named major.go, and paste the next code into file. Save the file and see beneath.

bundle major
import "fmt"

func major() {
    fmt.Println("Hiya, World!")

To check that the code runs as anticipated, run both the go run . or go run major.go command from the terminal. The output is proven beneath.

The output of the main.go command
Now that every one is working as anticipated, within the subsequent part we’ll proceed to find out about creating Dockerfiles. Let’s proceed.

An intro to Dockerfiles

A Dockerfile normally accommodates the mandatory directions for constructing Docker photographs on your program. Utilizing the docker construct command on the CLI, we are able to create an automatic construct that executes a number of command-line directions in succession.

For instance, we are able to make use of the -f flag with the docker construct command to level to a Dockerfile anyplace in our system path. This command builds a Docker picture based mostly on the directions within the Dockerfile.

docker construct -f /path/to/docker/file

With the intention to create a Dockerfile for our utility, create a brand new Dockerfile within the root of our challenge.

Create a new Dockerfile at the root of the application

Contained in the Dockerfile, proceed to put in writing the directions wanted to construct our Docker picture for our Go utility. Add a line contained in the file that tells Docker which base picture we must always use for our utility.

FROM golang:1.16-alpine

This line tells our Dockerfile to inherit and make use of the golang:1.16-alpine picture as a base picture for our personal utility picture. This picture is an official Go picture that’s already hosted and distributed, and accommodates the entire instruments and packages wanted to run a Go app. Which means we shouldn’t have to reinvent the wheel and create a brand new base picture from scratch, however fairly prolong a preexisting, commonplace one for our personal picture wants.

Subsequent, we are able to proceed to incorporate the subsequent strains for our Dockerfile. Within the following part, we’ll go over what every line represents.


COPY go.mod ./
RUN go mod obtain

COPY *.go ./

RUN go construct -o /go-docker-demo


CMD [ "/go-docker-demo" ]

First, the WORKDIR /app line creates a brand new listing contained in the Docker picture. The thought is to make use of this listing to accommodate our Docker picture and run the remainder of our Docker instructions inside that listing in order that it may possibly function the brand new reference level for our supply code contained in the Docker container transferring ahead.

The following two strains, from 3-4, copy the contents within the go.mod file and paste them into the app listing, which is our present working listing inside our Docker container. As we are able to see, we now have made use of the COPY command, which tells Docker the situation of the file we wish to copy and the vacation spot we intend to repeat it into.

Subsequent, we wish to set up the modules wanted to compile our Go app. This step comes after we now have copied the file within the final step into the challenge folder. The RUN command executes and installs the Go modules into the listing contained in the picture.

Now that we now have pulled the Docker picture from DockerHub and put in the modules in our go.mod and go.sum information, the subsequent step is to repeat our supply code into the picture. As we are able to see on line 7, we mainly use a wild card to repeat all information that finish with the .go extension into the present path or working listing. This is similar listing the place the Dockerfile can be positioned, contained in the Docker picture.

The following step is to construct our utility as we’d domestically. To take action, we use the RUN command once more. As we are able to see on line 9, we’re utilizing the go construct command to construct our Go app. This may create a Go binary with the identical title within the root of the Docker picture, the identical means it does on our native machine once we run go construct.

Lastly, it’s time to run our Docker picture. We have to inform Docker which command to run when the picture is used to begin a container. On line 13 within the Dockerfile above, we are able to see the CMD argument with the title of the binary in the identical path. This runs our code contained in the Docker container.

Now that we’re completed with setup, let‘s proceed to construct the Docker picture contained in the container within the subsequent step.

Constructing the Docker picture for our utility

A Docker picture accommodates configuration for a Docker container, resembling surroundings variables, a default command to run, and different metadata. A picture must also have all the things you might want to run an utility, together with the code or binary, runtime, dependencies, and another file system objects required.

To construct a picture, we use the docker construct command, which creates a Docker picture from the Dockerfile. Proceed to the terminal and run the command within the present listing:

docker construct -t go-docker-demo .

The -t flag is a tag to assist us establish our Docker picture. See the output of this command beneath.

Identify the Docker image using our -t flag

As we are able to see above, we now have efficiently constructed our Docker picture contained in the container. To confirm, we are able to view our picture contained in the container by working the command beneath:

docker picture ls

The output is proven beneath.

Verify our successful Docker image build

Within the subsequent step, we’re going to run our Docker picture.

Run our Docker picture inside a container

To run our picture inside a container, we are able to make use of the docker run command. It requires one parameter: the picture title.

Let’s begin our picture and ensure it’s working appropriately. Run the next command in your terminal.

docker run go-docker-demo    

To confirm the output of this command, and that our code runs as anticipated contained in the Docker container as it might domestically:

Verify that the code runs as expected inside the Docker container

We will run the docker ps command to indicate us a listing of containers working on our machine.

Our list of containers running on our machine

The picture above signifies that we didn’t see a picture working — as a result of our app shouldn’t be like an internet server that runs repeatedly. For apps that run repeatedly, we’d see a container picture working repeatedly with all the opposite particulars.

One other strategy to verify is to go to the Docker desktop. Navigate to the display beneath to view the logs.

Confirm the containers running via Docker desktop

If we click on the Docker picture and verify the logs, we are able to see that our picture is up and working.

You can check the logs in Docker desktop to see how well the containers are running

Lastly, we are able to run our container domestically as a full growth surroundings with the dev surroundings choice within the Docker desktop app (though it’s presently in public beta, so there may be some refined bugs). To strive it out, navigate to the Create a Dev Atmosphere tab on Docker desktop.

You can also use the Docker dev environment

Click on the Get Began button, create a brand new dev surroundings, and choose the Native Listing radio button. Lastly, add the trail to your native repository.

Add the path to your local repository

Click on Proceed and watch for the dev surroundings to be constructed.

Dev environment in Docker desktop built successfully

We will proceed to open the Docker picture in our code editor. At present, it integrates with VS Code.

Docker image can be used in your code editor


On this submit, we now have realized the right way to Dockerize a Go utility utilizing the usual Go base picture from DockerHub. We’ve got gone via all of the steps from organising a fundamental Go app, organising the Dockerfile, understanding the steps within the Dockerfile, constructing our Docker picture, and working our picture contained in the Docker container.

As we now have seen, Docker is a device that’s related to most code infrastructure setups as a consequence of its significance, a few of which we now have earlier outlined on this submit. One other benefit of Docker containers is that they make our apps extra transportable as a result of we are able to reuse and distribute them extra simply. In addition they give the developer extra management over sources, which may end up in higher use of computing sources.

proactively surfaces and diagnoses a very powerful points in your apps and web sites

Hundreds of engineering and product groups use to cut back the time it takes to know the basis explanation for technical and value points. With LogRocket, you’ll spend much less time on back-and-forth conversations with clients and take away the countless troubleshooting course of. LogRocket permits you to spend extra time constructing new issues and fewer time fixing bugs.

Be proactive – strive as we speak.



Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments