Dit artikel beschrijft gedetailleerd hoe je een Docker-image bouwt.

Principe

  1. Gebruik Hugo om de site te bouwen en statische bestanden te genereren.
  2. Gebruik Nginx als server om verzoeken af te handelen.

Dockerfile

Maak een Dockerfile aan in de hoofdmap van de site.

 1###############
 2# Build Stage #
 3###############
 4FROM razonyang/hugo as builder
 5
 6WORKDIR /src
 7COPY . /src
 8
 9ARG HUGO_ENV=production
10ENV HUGO_ENV=${HUGO_ENV}
11
12# Base URL
13ARG HUGO_BASEURL=/
14ENV HUGO_BASEURL=${HUGO_BASEURL}
15
16# Module Proxy
17ARG HUGO_MODULE_PROXY=
18ENV HUGO_MODULE_PROXY=${HUGO_MODULE_PROXY}
19
20# NPM mirrors, such as https://registry.npmmirror.com
21ARG NPM_CONFIG_REGISTRY=
22ENV NPM_CONFIG_REGISTRY=${NPM_CONFIG_REGISTRY}
23
24# Install dependencies
25RUN npm install
26RUN npm install -g @fullhuman/postcss-purgecss rtlcss
27
28# Build site
29RUN hugo --minify --gc --enableGitInfo
30
31# Set the fallback 404 page if defaultContentLanguageInSubdir is enabled, please replace the `en` with your default language code.
32# RUN cp ./public/en/404.html ./public/404.html
33
34###############
35# Final Stage #
36###############
37FROM nginx
38COPY --from=builder /src/public /app
39COPY deploy/nginx/default.conf /etc/nginx/conf.d/default.conf
  • Er zijn twee fasen in de build: een bouwfase en een releasefase. De releasefase bevat alleen de gegenereerde statische bestanden, waardoor de Docker-image zo klein mogelijk blijft.
  • Als defaultContentLanguageInSubdir is ingeschakeld, verwijder dan het commentaarteken en pas de instelling aan.
  • De parameter HUGO_BASEURL wordt gebruikt om de baseURL van de site tijdens de build op te geven; dit is vooral handig wanneer de baseURL afwijkt van de configuratie. Je kunt dit verwijderen als het niet nodig is.
  • HUGO_MODULE_PROXY en NPM_CONFIG_REGISTRY zijn optionele buildparameters die je kunt verwijderen als ze niet nodig zijn.

Nginx

Maak een deploy/nginx/default.conf aan in de hoofdmap van de site:

 1server {
 2    listen       80;
 3    listen  [::]:80;
 4    server_name  localhost;
 5    
 6    root   /app;
 7
 8    location / {
 9        index  index.html index.htm;
10    }
11
12    location ~* ^/([^/]+) {
13        index  index.html index.htm;
14        error_page 404 = @error;
15    }
16
17    error_page 404 /404.html;
18    location @error {
19        try_files /$1/404.html /404.html =404;
20    }
21}

Bouwen

1$ docker build -t mysite \
2  --build-arg HUGO_BASEURL=https://example.com \
3  .
  • mysite: de naam van de image.
  • HUGO_BASEURL: de baseURL.

Voor gebruikers in China (vasteland) moet je HUGO_MODULE_PROXY en NPM_CONFIG_REGISTRY opgeven om de image succesvol en snel te kunnen bouwen:

1$ docker build -t mysite \
2  --build-arg HUGO_BASEURL=https://example.com \
3  --build-arg HUGO_MODULE_PROXY=https://goproxy.cn \
4  --build-arg NPM_CONFIG_REGISTRY=https://registry.npmmirror.com \
5  .

Deployment

Er zijn veel manieren om een Docker-image te deployen, zoals docker run, k8s, enzovoort. Dit artikel behandelt alleen docker run.

Uitvoeren

1$ docker run \
2  -p 2333:80 \
3  --name mysite \
4  --restart=always \
5  mysite

Voor lokaal testen moet je de baseURL-parameter of de buildparameter HUGO_BASEURL wijzigen, bijv. http://localhost:2333.

Stoppen

1$ docker stop mysite

Starten

1$ docker start mysite

Verwijderen

1$ docker rm mysite