Anders är en webbutvecklare och hårdrockare som gillar brädspel, kaffe och öl.

Metalsmith i container

En sak jag länge varit sugen på att utvärdera är att bli av med beroendet till node.js i mindre, simplare projekt. Som denna webbplats, exempelvis, som enbart behöver det för att transformera markdown-filer till HTML-dokument med Metalsmith.

Det enklaste sättet att göra det på är att använda sig av containers, där allt som behövs ligger i en image. Detta inlägg beskriver hur jag gjorde för att få till det.

Indentifiera vilka volymer som behövs

Jag behöver i princip tre volymer för att kunna återanvända samma container image flera gånger för att bygga min webbplats.

  • src - Metalsmiths source directory, alltså alla filer som ska transformeras.
  • pub - Metalsmiths target directory, dvs resultatet av Metalsmith.
  • assets - alla statiska filer jag bara vill bifoga som de är, t ex bilder, CSS-filer, redan kompilerade webbkomponenter och liknande.

Containerfile

Ser ut såhär, i sin enkla helhet.

FROM node:20-alpine AS base
WORKDIR /app
FROM base AS deps
COPY package*.json ./
RUN npm install
FROM deps AS final
RUN mkdir ./assets ./pub ./src
VOLUME ["./assets", "./pub", "./src"]
COPY . .
ENTRYPOINT ["node", "index.js"]

... med några väl valda ignores.

Bygga container image lokalt

Jag gör detta med Buildah, men det går lika bra att göra med Docker.

buildah build --net host .

Kör container imagen lokalt för att bygga webbplatsen

Jag gör detta med Podman, och monterar de tre volymerna.

podman run \
--net host \
-ti \
--volume ./dist:/app/pub \
--volume ../../Sync/Rahvin/madrse/src:/app/src \
--volume ../../Sync/Rahvin/madrse/assets:/app/assets \
[container id]

Ovanstående volymsökvägar råkar vara det jag använder för stunden. Katalogerna behöver såklart finnas på filsystemet.

Ersätt [container-id] med det ID som gavs av Buildah.

Hosta container images på Github Packages

Då jag har koden på Github så passade jag på att lägga in en action som bygger och publicerar container imagen automatiskt. Då blir det ännu enklare att bygga sajten, eftersom jag då bara behöver hämta imagen från Github Packages istället för att bygga den ochh hålla repa på container-id.

podman run \
--net host \
-ti \
--volume ./dist:/app/pub \
--volume ../../Sync/Rahvin/madrse/src:/app/src \
--volume ../../Sync/Rahvin/madrse/assets:/app/assets \
ghcr.io/madr/19:main

Två saker extra krävs för detta.

  • Skapa upp en action för att bygga och publicera Docker images.
  • Använd Dockers namngivning, dvs Dockerfile och .dockerignore. Podman och Buildah finns ej på Github Actions i skrivande stund, så Containerfile och .containerignore kommer inte att fungera.