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_script
和blog_db
两个容器之间存在网络通信。在上面的例子中,我定义了一个名为 blog
的网络,并在 blog_script
和 blog_db
服务中使用 networks
指令将它们加入该网络。
这样,当我们运行 docker-compose up
命令时,blog_script
和 blog_db
服务将在同一个网络中运行,它们将能够相互通信,例如通过容器名称进行通信。可以在blog_script
容器中用curl localhost:3306
或者curl blog_db:3306
进行验证是否通信成功。
请注意,如果你的 Docker Compose 文件中有多个网络,你需要使用 networks
指令将服务加入正确的网络。
最后,使用up命令启动。本次部署圆满成功!🍔 🍻