Using Makefiles

Makefiles are great to self-document frequently executed commands in a repository. They provide easy access to the bash code by easy to remember tags.


Only tabs are allowed to indent lines. The indentation groups the commands under the rules.

Set Bash as the shell

On some systems Bash is not the default shell when Makefiles run. To set the shell add the line to the top of the Makefile:

SHELL := /bin/bash

Using pushd

Make executes every line in a new context. If you need to use pushd, popd you need to write all commands between them in one line separated with semicolons.

	pushd ../terraform; terraform apply; popd

DevOps Engineering part 1. (Ubuntu server) – Install the DevOps development tools on Ubuntu server

Ubuntu server does not have a user interface, we will use the terminal to install the DevOps tools.


  • On your workstation open a web browser and navigate to to get the version of the latest Terraform release.
  • Substitute the x.x.x with the latest version
# Use the temp directory
cd /tmp

# Update the package repository
sudo apt-get update

# Install unzip
sudo apt-get install unzip

# Download the latest version of Terraform (substitute the x.x.x with the latest version)

# Unzip the downloaded file (substitute the x.x.x with the latest version)

# Move the executable to a directory in the path
sudo mv terraform /usr/local/bin/

# Check the installed version
terraform --version


To install AWS CLI with the package manager.

# Update the package repository
sudo apt-get update

# Install aws cli
sudo apt-get install awscli

# Check the version
aws --version

Update AWS CLI to the latest version

Older versions of the AWS CLI do not contain the EKS tools, you may get the error message:
Invalid choice: ‘eks’, maybe you meant:

To update AWS CLI

# Install Pip
apt install python-pip

Using the Windows Subsystem for Linux (WSL)

Sharing files between Windows Subsystem for Linux and Windows

Access the Windows files from Linux

  • Start WSL
  • In the terminal navigate to the /mnt directory
cd /mnt
  • The drives are mounted to sub-directories
root@P70:/mnt# ls -l
total 0
drwxrwxrwx  c
drwxrwxrwx  d

Access the Linux files from Windows

  • Start the WSL application in Windows 10 (in this case with the Ubuntu distro)
  • Open Windows Explorer in Windows 10
  • Navigate to \\wsl$

Enable copy/paste

To enable copy/paste in the default WSL terminal

  • Right-click the top bar and select Properties
  • On the Options tab check Use Ctrl+Shift+C/V as Copy/Paste
  • You can also enable a larger command history buffer.

Build a Docker container image for your application

Create the image

A Docker container image is one of the best formats to distribute your application. The container provides an immutable environment, so the application runs the same way on your workstation and on any server.

We will use the simple Go application we have created in the Your first Go application post. In the main application directory open the text editor and create the Dockerfile

code Dockerfile

We will create a multi-stage build script. The advantage is that the final image is very small, as it only contains the compiled Go application, not the source code, not even the Go compiler. Enter the code

FROM golang:alpine as builder


COPY . /src

RUN go build -o myapp cmd/myapp/*

FROM alpine:3.11.3


 COPY --from=builder /src/myapp /app

 ENTRYPOINT ["/app/myapp"]

Build the image

docker build -t myapp .

Check the image. myapp should be the image on the top

docker images

The output should be something like this

REPOSITORY        TAG        IMAGE ID            CREATED           SIZE
myapp             latest     267e26010d88        2 minutes ago     7.66MB

Run the image to test it.

docker run --rm -it myapp

If you want to run the image with Docker Compose create a compose file

code docker-compose.yml

Enter the code

version: '3'

    image: myapp

Run the image in Docker Compose

docker-compose up

The output should be

Creating network “myapp_default” with the default driver
Creating myapp_myapp_1 … done Attaching to myapp_myapp_1
myapp_1 | Application config
myapp_1 | MyPackage running
myapp_myapp_1 exited with code 0

Runt the image in Docker Swarm

Initialize the Docker Swarm

docker swarm init

Run the container in the swarm

docker stack deploy -c docker-compose.yml myapp

The output should be

Creating network myapp_default
Creating service myapp_myapp

Check if the stack is running

docker stack ls

The output should be

NAME                SERVICES            ORCHESTRATOR
myapp               1                   Swarm

Check if the service is running

docker service ls

Remove the stack

docker stack rm myapp

Could not create an instance of type ‘Microsoft.AspNetCore.Http.HttpContext’

The new version of dotnet core cannot handle the HttpContext in the MVC model.

An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Could not create an instance of type ‘Microsoft.AspNetCore.Http.HttpContext’. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, set the ‘HttpContext’ property to a non-null value in the ‘…’ constructor.


Remove the line from the model:

public HttpContext HttpContext { get; set; }

Remove the line from the controller:

model.HttpContext = HttpContext;

Cities: Skylines undo

The Cities: Skylines game does not have a usual undo function, but by pressing the F1 key we can save the current state into a “Quick Save” file before a change.

To load the state from the Quick Save file, select it in the list of the Load Game menu item

The files are saved on your hard drive at

C:\Users\YOUR_USER_NAME\AppData\Local\Colossal Order\Cities_Skylines\Saves

Error: Failed to instantiate provider “aws” to obtain schema: Incompatible API version with plugin. Plugin version: 4, Client versions: [5]

When a provider has been updated outside of Terraform, (for example in Terraformer) Terraform can get out of sync with that provider version. terraform init works, but terraform plan throws the error message:

Error: Failed to instantiate provider “aws” to obtain schema: Incompatible API version with plugin. Plugin version: 4, Client versions: [5]

To update Terraform to be able to use the new provider execute

terraform init -upgrade

Cities: Skylines game frequently crashes

The Cities: Skylines game keeps objects in memory even if the object is not used. Even a 16GB system can crash frequently if the memory usage is not managed.

“Oops! The game crashed

The memory usage is high, even when the map is not too complex.

Enable enough Virtual Memory

Make sure Windows has enough Virtual Memory configured. I have set up 4096 MB minimum and maximum Virtual Memory for my 16 GB Toshiba laptop.

Install the Loading Screen mod

This page explains the issue and how to solve the problem:

This is the summary of the steps you can take to stabilize the game on your computer

Get jstack and other Java utilities without installing the Java JDK

  • Open a Windows command prompt
  • Create a directory for the volume and start the openjdk container
md c:\windows\temp\openjdk
docker run -it --rm -v c:\windows\temp\openjdk:c:\temp openjdk:8
  • In the Java container copy the contents of the Java bin directory to the mapped volume
cd openjdk-8\bin
copy *.* c:\temp