群晖 NAS 里怎么更新 Docker 容器

我在使用一款自建的开源备忘录应用 memos,我把它运行在群晖里面。使用的是 docker,一条命令即可运行起来

docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:latest

我在群晖里面,网络直接使用 host,因此不需要填写端口,只需在「存储空间」里选择一个目录,来映射到容器内的 /var/opt/memos

目前使用了两周多了,感觉还挺不错的。

现在的问题是,我运行的是 0.10.3 的版本,目前最新的版本已经到 0.11.2 了,我想要升级到最新的版本。

下面是我的实际操作。

首先我们要拉取最新的镜像,依旧到注册表搜 memos,右键然后点「下载此映像」,或者直接双击也可以。

search-memos

镜像下载完成之后,我们把容器停掉,再重新打开,是没有效果的,依然还是旧版本的。此时应该做的是,创建一个新的容器。但是在群晖里面,我们不需要重新填写容器的配置,因为它可以直接复制。选中一个容器,然后上方的设置里面,有个「复制设置」的选项。

copy-settings

点击之后,它会让我们「输入新容器的名称」,我给它起名为 「memos-0.11.2」,因为我估计过段时间又得来升级的,那就每次复制后都填一下当前的版本吧。

然后我们可以启动这个新的容器,看看运行正不正常,正常的话,就可以删掉旧的容器了。

我这个容器比较简单,而且网络方面直接用 host,所以不用设置端口。

但是我发现其它需要设置端口的容器,复制之后,端口会发生变化的。例如我有一个容器的端口是 10086,复制之后,群晖自动给新的容器生成一个随机端口,如 49155 ,所以看来,带端口的容器,复制之后,还得修改一下。

port-10086

但是我们不能直接修改新容器的端口,因为不能两个容器同时使用一个端口。例如我这里的 10086 已经被就容器占用了,新的容器就没法用。虽然直接把旧容器删除了,新容器就可以使用 10086 这个端口,但是现在并不清楚新容器,是否能正常运行,所以不建议删。

我们可以先修改旧容器的端口,例如改为 10087,然后再修改新容器的。这样新的容器应该就可以运行起来了。

不过,此时如果你用命令行或者 portainer 查询镜像,应该会发现,多出一个 TAG 为 none 的镜像。

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
neosmemo/memos latest 8b795254a96c 2 days ago 34.5MB
neosmemo/memos <none> 50d503594da5 4 weeks ago 24.8MB

从日期我们也可以判断出,none 就是那个旧的版本。想要删除它,我们需要把旧的容器删除掉。

之后如果你是用 portainer 的话,勾选然后删除即可。如果没装 portainer,那就用命令行来删除吧,因为群晖的 docker 面板里,在映像中是找不到它的。

先 ssh 连接群晖,执行 sudo i 切换到 root 用户。如果你也为每次都要这样操作一次而感到困扰,可以参考一下我之前的文章:群晖建立永久 root 账号

需要先列出设备中所有 docker 镜像

docker images

然后找到 none 的 IMAGE ID,像我这里是 50d503594da5,然后可以像这样来删除它

docker rmi 50d503594da5