Build an Inkscape container

Brett Weir, January 6, 2023

In this article, we'll develop a container for Inkscape, allowing us to incorporate it into a CI/CD pipeline. With that, you'll be able to start automating vector image processing tasks right now and at no extra cost.

But first, why Inkscape?

You've probably encountered situations where you need a vector graphics program. This might be to resize a logo, draw your own logo, or generate app icons for multiple platforms.

Inkscape is an excellent tool for this job for a number of reasons:

Another nice feature of Inkscape is that it has a command line interface. 🤯 This means that you can use it to script vector image processing tasks, all from the command line, which is what we'll be doing below to automate image exports in CI.

Create a new project

Each new build container needs its own project!

This allows the container to be built and released independently of other development activities that are going on. This also makes it easier for new projects to use the new container as well.

Create a new project in GitLab. Then clone it and change into its directory:

git clone [email protected]:your-group/inkscape-container.git
cd inkscape-container/

Add a Dockerfile

Create a new Dockerfile in the root of your project:

touch Dockerfile

Then edit the Dockerfile as the following.

FROM statement

Let's use an Ubuntu base. Normally, I'd try to find a smaller and lighter base, but because this is a build container, and Inkscape is a complex piece of software with many dependencies, we're better off sticking with simple:

FROM ubuntu:22.04

Install Inkscape via apt

Ubuntu has a very recent version of Inkscape in the apt package manager, so it's not required to build or manually download Inkscape. Instead, we just install:

# hadolint ignore=DL3008
RUN apt-get update -y \
    && apt-get install -y --no-install-recommends \
        inkscape \
    && rm -rf /var/lib/apt/lists/*

I call this an apt sandwich, as apt commands inside a Dockerfile are almost always structured like this.

CMD statement

For a build container, you want to set the CMD to a shell. GitLab CI expects this, and you'll have problems if the default command starts a service or something. I like Bash, so I'm using /bin/bash:

CMD ["/bin/bash"]

Completed Dockerfile

Here is what the completed Dockerfile should look like:

FROM ubuntu:22.04

# hadolint ignore=DL3008
RUN apt-get update -y \
    && apt-get install -y --no-install-recommends \
        inkscape \
    && rm -rf /var/lib/apt/lists/*

CMD ["/bin/bash"]

Test the container locally

To save yourself some CI iteration time, it's a good idea to test your container build locally before pushing to GitLab:

docker build -t inkscape-container .
$ docker build -t inkscape-container .
Sending build context to Docker daemon  40.45kB
Step 1/3 : FROM ubuntu:22.04
 ---> 2dc39ba059dc
...
...

You can verify that Inkscape is available by running inkscape --version inside the container:

docker run --rm -it inkscape-container inkscape --version

Add a GitLab CI file

You can build and publish the Inkscape container by using the BrettOps container pipeline. We'll use the kaniko variant, since it's the most portable and we don't have special build requirements.

Create a .gitlab-ci.yml file and add this snippet:

include:
  - project: brettops/pipelines/container
    file: kaniko.yml

By default, this will look for a Dockerfile in the root directory of your project, which is where yours already is at this point, so no configuration is needed.

Test your pipeline by adding a test image

You'll need an SVG image to convert to PNG. This will be used to add a self-test job to your build container CI. I'm using a drawing of a bearded reedling, because these birds are awesome. You can go ahead and use it, too:

Illustration of a bearded reedling
Illustration by Claire Nguyen. This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License

Add the SVG file directly to your repo. It allows the image to be versioned along with your build container, and defends against network issues in your CI environment. Also, it's an SVG, which is just markup, so it can be versioned nicely in Git.

Add a CI job to the deploy stage, which comes after the container build, to test the image that was just built:

test-inkscape:
  stage: deploy
  image: registry.gitlab.com/your-group/inkscape-container
  script:
    - inkscape --version
    - inkscape logo.svg -o logo.png -w 144 -h 144
  artifacts:
    paths:
      - "*.png"

Commit your changes

This is all you need for your container to be built and published to GitLab. Commit your changes:

git commit -m "Initial commit"
git push --set-upstream origin main

Now you can sit back and wait. You can check on your CI pipeline in GitLab in the meantime.

Once the container is built, you can start using Inkscape in CI pipelines as an easy way to render all the icons you might need. Yay! 🎉