
在将Portainer升级到Community Edition 2.33.5 LTS版本后,遇到了本地环境无法加载、Stack管理失效的问题。尽管容器本身仍在运行,但Portainer界面显示环境为"Down",且无法通过UI管理现有Stack。尝试了多种方法,包括重建Portainer容器、删除Portainer数据库并重新初始化,但这导致Stack虽然可见,却带有"有限控制"的提示,且无法正常部署。 尝试重新部署Stack时,系统提示同名Stack已存在。最终的解决方案是:发现重新部署的Stack使用了新的项目ID,导致无法关联旧数据。通过删除新Stack的数据,并将旧Stack的数据文件夹复制到新项目ID对应的位置,然后执行docker compose up,成功恢复了所有Stack及其数据,解决了管理难题。
1. Portainer容器升级后加载环境失败
事情发生的原因是打开Portainer的管理界面,有提示让我升级到LTS版本。我手欠,就升级到了Community Edition
2.33.5 LTS版本。当我再打开Portainer时,登录界面可以正常登录。本地环境也是显示Up的,但是只要一点本地环境,那个状态就变成Down了。

我在服务器上查看容器的状态,倒是没受影响。但是无法进行任何的更改了,因为原来是通过Portainer的UI界面来管理Stack的。而在服务器上,存放Docker-Compose文件的地方和实际存放容器数据的地方并不在一起。
2. 重建容器
我尝试重新拉镜像并重新创建容器,可以进入到本地环境的管理界面。虽然显示有stacks,但是只能看见portainer自己的stack,别的stack都没有了。

但是点开容器选项,发现容器都还在。容器的管理也都是好用的。

3. 重建Stack
我想,既然不显示,那我就再重建一下Stack就好了。首先需要切换到root用户,再进入到/data/compose文件夹下。通过在Portainer的Container界面里查看Docker Compose文件的位置找到它。

然后复制内容到Portainer GUI的Stacks > Add Stack菜单下,再Deploy。

这时又出现了无法部署的情况,说是同名的Stack已经存在了。
4. 重建Portainer
后来我实在没有办法了,只能将Portainer自己的本地数据库给删除了。根据你Portainer的Docker Compose文件的不同,实际位置不一定相同。在容器内部是在/data文件夹下面。因为Portainer并没有提供Shell,无论是bash还是sh都没有。所以依赖于你映射出来的文件。
我自己的Portainer的Docker Compose文件是这样的。我没有放到Nginx的反向代理后面,因为我不想因为Nginx的原因导致我无法管理到其他的容器。确切地说,我的Nginx也是被Portainer管理的。
yaml
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer_data:/data
- /etc/letsencrypt/live/zenseek.site/fullchain.pem:/certs/fullchain.pem
- /etc/letsencrypt/live/zenseek.site/privkey.pem:/certs/privkey.pem
command: >
--sslcert /certs/fullchain.pem
--sslkey /certs/privkey.pem
将Portainer的容器停掉,再将/data/portainer.db删除。删除前先备份一份到别的地方。再重新启动容器,因为它自身的数据库没有了,它会当成是新的实例,重建本地的数据库。

这时就和新创建的Portainer实例一样需要设置管理员账号密码。但是进去之后是可以直接看到本地环境的,也可以点进去。

当我满心欢喜地进到Stack选项的时候,发现Stack都回来了。但是后面标识了是有限的控制。这种情况只有是在不使用Porainer直接在本地Docker Compose Up起来的stack才会这样。因为它的Docker Compose文件和data是放在不同的地方,且需要root权限。即使我在存放Docker Compose文件的文件夹下Docker Compose Down也是不好用的。在这种情况,我既不能通过Docker CLI也不能通过Portainer来管理Stack。
5. 解决方案
中间我问了Gemini,ChatGPT,Clause和Deepseek,也尝试了很多的方法。发现StackOverflow上也有很多人反应同样的问题,但是上面的解决方案对于我并不好用。
这时我想到刚才的报错说是有容器占用了那个stack,我就想能不能把那个容器删除了再部署呢?但是我就怕,删除容器后,数据恢复就没有了。本来使用Portainer是为了方便的,结果出了这种情况,导致无法管理Stack。早知道这样,还不如一个文件夹一个文件夹部署Docker Compose的文件和数据了。
但是在走投无路的情况下,我找了不是那么重要的容器删除了。然后进行重新再Add Stack,我发现可以部署了,而且小叹号也没有了。但是数据呢?全没了,这一个新的部署。

在细心的观察下,我发现新的部署使用了不同的项目ID,因此导致无法加载过去的数据。我把Docker Compose Down掉后,将新的项目下的数据都删除,将就项目ID的数据文件夹复制过来。再Docker Compose Up一下,一切就完好如初了。问题就这样解决了。

📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site