前提

实验室的平台先前一直在香港的谷歌云上运行,近期要备案一下域名并且迁移到国内的VPS上,一方面因为谷歌云的资费有点吐舌头,并且香港的IP 学校的VPN似乎也不能代理,所以就要实施一个搬到国内的计划。

博客的PHP的站倒是好迁移,主要就是CTF平台可能不太好迁移,毕竟是一个容器集群,果不其然,踩了好多坑,所幸是最后成功迁移了所有服务。

本文主要讲过程中的报错解决以及注意事项,具体的安装方法请见WankkoRee师傅的仓库CTFd-with-Whale-and-H1ve

Hole1 :failed to solve.....

首先拉取项目,并且确保安装了Docker以及Docker-compose,然后进入项目文件夹中,执行Docker-compose安装,这里碰到第一个坑:

原因:原始的 Dockerfile 中写的源是阿里alpine V3.12的源,但没有约束alpine的版本 ,而最新的已是V3.15,在3.12的仓库里找3.12确实难免会有报错

解决方案: 在Dockerfile中将源从V3.12修改为V3.15 ,保存重新compose即可通过Level1

Hole2 :failed to creat network...

当出现这个报错的时候就要把现在创建的Docker网络先都删掉,然后执行解决方案

第一步: 编辑目录下的Docker-compose.yaml,在frp_contariner网络的配置下方添加一行“attachable: true

第二步:执行一次 docker swarm init

Hole3 :Error response from daemon....

解决方案:这个报错是要将容器网络加入集群,首先 docker node ls,然后执行 docker node update --label-add name=linux-1 节点id

这一步弄完运行容器有几率还报错,如果还报错的话,就先删除所有本次创建的容器和网络,然后按照顺序执行下列命令后重新compose

docker swarm init(如果提示This node is already part of a swarm就忽略他)
docker node ls
docker node update --label-add name=linux-1 节点id

Hole4 :CTFd容器无法运行 ImportError: cannot import name 'escape' from 'jinja2'

网络问题解决之后,查看容器状态发现CTFd的镜像启动失败

随后试用 docker logs 命令查看容器日志,发现报错 ImportError: cannot import name 'escape' from 'jinja2'

原因:flask版本是1.x.x的,该系列版本都是依赖Jinja的

解决方案:在目录下的requirement.txt中添加一行”Jinja2==3.0.3“,随后删除全部容器,因为CTFd的容器需要按顺序启动,所以要先删除全部容器,随后删除CTFd的镜像,重新执行compose(因为修改了CTFd文件夹内容,需要重新build镜像)

番外Hole5:权限问题

之前一直没有遇到过的问题,写这篇文章时候遇到了,意思就是docker-entrypoint.sh文件没有执行权限

解决方法:将目录下的”docker-entrypoint.sh“权限改为777 (chmod 777 docker-entrypoint.sh)

之后就能顺利运行喽~

届ける言葉を今は育ててる
最后更新于 2023-03-20