Test your Docker images

Published more than 6 months ago, the content may be out of date.

Do you build Docker images regularly? You certainly know that just because your image was built without errors, it doesn’t mean it works as you expect. Building a Docker image, like any code, must be verified and validated. As your code, you can write tests that will check your images.

The tool I personally use is called Container Structure Test. Developed by Google, it allows you to write unit tests for your Docker images. Written in Go, it’s available as a binary compatible with most operating systems.

With Container Structure Test, you will:

  • Run commands inside the container and verify the output or any errors produced,
  • Test file existence,
  • Check file contents (including its associated metadata),
  • Verify the configuration of the container itself.

Once downloaded, setting up tests is done by writing rules in a YAML file. Here’s an example configuration I use to test the construction of Docker images running PHP projects:

schemaVersion: "2.0.0"

# Vérification de la présence de certaines variables d'environnement
globalEnvVars:
    - key: GITHUB_TOKEN
      value: github-token

commandTests:
    - name: "Symfony CLI installed"
      command: "which"
      args: ["symfony"]
      exitCode: 0
    - name: "Check PHP extensions"
      command: "php"
      args: ["-m"]
      expectedOutput:
          - "amqp"
          # ...


fileExistenceTests:
- name: 'Configuration PHP'
  path: 'etc/php/8.3/php.ini'
  shouldExist: false

fileContentTests:
- name: 'Linux Version'
  path: '/etc/os-release'
  expectedContents: ["VERSION_ID=3.14.2","NAME=\"Alpine Linux\""]

When the setup is complete, you just need this command:

container-structure-test test --image my-registry.jdecool.fr/php:8.3 --config php-tests.yaml

=======================================
====== Test file: php-tests.yaml ======
=======================================
=== RUN: Command Test: Symfony CLI installed
--- PASS
duration: 306.265278ms
stdout: [...]

=== RUN: Command Test: Check PHP extensions
--- PASS
duration: 303.302806ms
stdout: [...]

=== RUN: Command Test: Configuration PHP
--- PASS
duration: 276.503651ms
stdout: [...]

=== RUN: Command Test: Linux Version
duration: 276.503651ms
stdout: [...]

=======================================
=============== RESULTS ===============
=======================================
Passes:      4
Failures:    0
Duration:    789.707605ms
Total tests: 4

PASS
Jérémy DECOOL

Jérémy DECOOL

As a software architect, I share my thoughts on best practices in software development, software architecture and team organization for maintainable and scalable projects.