docker-compose+hugo+python | 使用容器编排技术部署一个hugo项目

构建镜像

1. hugo

Dockerfile文件编写

FROM busybox:latest

MAINTAINER Billy_Chen

COPY ./hugo_0.109.0_linux-amd64 /bin/hugo

ENV TZ=Asia/Shanghai \
    PATH="/bin/hugo:$PATH"

首先要解决的就是hugo模块的容器构建,我的做法是:

使用dockerfile构建一个由Busybox镜像为基础的镜像,Busybox镜像是一个非常精简的Linux系统,包含了许多基本的命令,这个原生镜像足够小巧,镜像大小只有几兆。构建的同时,把hugo执行文件复制进去;接着在ENV指令处把执行文件/bin/go添加至环境变量:PATH="/bin/hugo:$PATH",这样就可以实现在生成的容器中终端执行hugo命令了。全部的dockerfile命令如上所示。

docker buildx build -t chenxuefan/hugo:v1 --platform linux/amd64,linux/arm64 . --push

最后使用build命令构建镜像,实际生成的镜像大小为87MB,非常小巧。

2. blog_site

有了hugo镜像,便可以基于这个镜像再构建一个专门负责生成网页源文件的镜像

这个镜像专门负责:执行hugo命令、网页源文件生成

Dockerfile文件编写:

FROM chenxuefan/hugo:v1

MAINTAINER Billy_Chen

ENV TZ=Asia/Shanghai \
    workdir=/chenxuefan.cn

WORKDIR $workdir

COPY ./themes $workdir

#CMD ["hugo", "-D"]

使用build命令构建镜像

docker buildx build -t chenxuefan/blog_site:v1 --platform linux/amd64,linux/arm64 . --push

3. blog_script

这个镜像专门负责:执行python命令

Dockerfile文件编写:

FROM python:3.10

ENV TZ=Asia/Shanghai \
    workdir=/chenxuefan.cn

MAINTAINER Billy_Chen

WORKDIR $workdir

COPY ./requirements.txt $workdir

RUN  pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

#CMD ["python3", "./blog_script/billie52707.py"]
docker buildx build -t chenxuefan/blog_script:v1 --platform linux/amd64,linux/arm64 . --push

编写 Docker Compose 模板文件

version: "3"

services:
  blog_site:
    image: chenxuefan/blog_site:v1
    container_name: blog_site
    command: hugo -D
    restart: 'no'
    volumes:
      - ./blog_site:/chenxuefan.cn
    networks:
      - blog

  blog_script:
    image: chenxuefan/blog_script:v1
    container_name: blog_script
    command: python3 ./blog_script/billie52707.py
    restart: 'no'
    volumes:
      - ./blog_script:/chenxuefan.cn/blog_script
      - ./blog_site:/chenxuefan.cn/blog_site
    depends_on:
      - blog_db
      - blog_site
    links:
      - blog_db
    networks:
      - blog

  blog_db:
    image: mysql
    container_name: blog_db
    restart: always
    environment:
      MYSQL_DATABASE: blog_db
      MYSQL_ROOT_PASSWORD: 1236
      LANG: C.UTF-8
    volumes:
      - ./blog_db/config:/etc/mysql
      - ./blog_db/logs:/var/log/mysql
      - ./blog_db/data:/var/lib/mysql
    ports:
      - 6606:3306
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]
    networks:
      - blog

networks:
  blog:
    driver: bridge

一共有三个容器,blog_site负责执行hugo命令并生成网页源文件;blog_script负责执行应用于博客文件处理的python脚本,blog_db负责数据库存储。

其中blog_scriptblog_db两个容器之间存在网络通信。在上面的例子中,我定义了一个名为 blog 的网络,并在 blog_scriptblog_db 服务中使用 networks 指令将它们加入该网络。

这样,当我们运行 docker-compose up 命令时,blog_scriptblog_db 服务将在同一个网络中运行,它们将能够相互通信,例如通过容器名称进行通信。可以在blog_script容器中用curl localhost:3306或者curl blog_db:3306进行验证是否通信成功。

请注意,如果你的 Docker Compose 文件中有多个网络,你需要使用 networks 指令将服务加入正确的网络。

image-20230425180858560

最后,使用up命令启动。本次部署圆满成功!🍔 🍻

后记


1077 字