最新给网站添加了一些新功能,所以又重新编译部署了一下。由于我本地使用的是Archlinux,而跑网站的服务器使用的是Debian,编译出来的二进制在运行时出现libc版本不匹配的问题。直接在服务器上编译需要太多编译依赖,服务器上的内存和磁盘资源也不太够用,于是就决定使用docker。
先贴上我的Dockerfile:
这里参考Docker上Rust 镜像里官方的推荐做法,先使用builder容器进行编译,然后直接将二进制拷贝到一个新容器中,这样就得到了一个相对干净、轻量的运行环境。在builder容器中由于有工具链和依赖以及编译临时文件,总大小有将近2个G,而新容器的大小只有150M左右。其实一开始我是使用alpine作为编译和运行环境的,这样构建出来的最终容器更小,只有几十M。但这样构建出来的程序总是跑不起来,具体原因还不太清楚,但似乎是musl的libc导致的问题,所以使用debian-slim轻松先搞定了。
由于服务器上的资源限制,无法在远端制作镜像,所以我选择把本地的docker镜像导出,再直接加载到服务器的docker中。使用docker save和docker load来将docker-images导出导入:
为了方便管理,不至于每次打那一长串难记的docker命令,我比较习惯使用docker-compose:
使用
来直接启动导入的镜像,不进行重新构建。为了能让容器中访问Host中的数据库,所以我将数据库的sock共享给了容器中,所以在连接数据库的时候,要指定使用unixsock的连接方式,比如使用如下的url: