我的Docker数据容器是空的。
我的Docker数据容器是空的。
我最担心的情况发生了:我的仅包含数据的Docker容器突然变空了。
这不是很严重:这是一台开发机器,我有备份。但我最担心的是因为我知道我对Docker的理解仍然有漏洞。
我在这个答案中读到了以下内容:
Docker容器会在磁盘上持久存在,直到使用docker rm明确删除它们。
以下是我感兴趣的容器(从docker ps
命令):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 478e59ecd218 dockerlocal_mongo_instance "/entrypoint.sh mongo" 大约一个小时前 12分钟前退出(137) dockerlocal_mongo_instance_1 0ca49f6629cb tianon/true "/true" 3小时前 大约一个小时前退出(0) dockerlocal_mongo_data_1
我有一个1)引用数据容器的mongo容器,和2)数据容器本身。我最近对引用数据容器的mongodockerlocal_mongo_instance_1
容器运行了几次docker rm
。
从docker ps
命令的输出中(见上文)可以看出,它说数据容器是在“3小时前”创建的。但是我大约2周前创建的。一些原始数据已经消失了。我的问题是,这是怎么发生的?还有其他可能性吗?
我已经检查了我的bash命令历史记录,docker rm
命令只在mongo容器上运行过,而不是数据容器 - 出于明显的原因,我一直非常小心地不去碰它。
有人可以解释一下吗?我一定在这里误解了某些基本的东西。
如果有其他可能的情况会导致数据容器以这种方式被删除和重新创建,我将非常感激。
Docker compose .yml文件(相关部分):
mongo_data:
image: tianon/true
volumes:
- /data/db
mongo_instance:
build: mongodb
volumes_from:
- mongo_data
ports:
- "27017:27017"
environment:
- MONGODB_USER=$S_USER_NAME
- MONGODB_PASS=$S_USER_PASSWORD
# command: --auth
我的Docker数据容器是空的
问题原因:
1. 使用Docker Compose的主要原因是其可移植性。通过在一个地方运行所有的Docker命令,可以简单地安装和管理。因此,如果使用Docker数据容器意味着将数据容器的创建移出.yml文件,会使一切变得复杂化。首先必须创建数据容器,然后运行Docker Compose。相比之下,我更喜欢只需上传.yml文件并运行它。
2. 在使用docker-compose之前,我发现单独创建数据容器也存在问题。建议在创建数据容器时重用自己的镜像,而不是使用像tianon/true这样的小型第三方镜像。但是我的镜像只有在运行docker-compose时才创建,而我还没有运行它,这就是一个先有鸡还是先有蛋的问题。
3. 我尝试使用tianon/true(和其他镜像)创建数据容器,但总是遇到权限问题。
解决方法:
因此,我移除了数据容器,并在mongo_instance上使用了卷参数。希望这也能解决我的原始问题...
问题出现的原因是运行了docker-compose rm
或docker-compose rm -f
命令,这会删除docker-compose.yml
中定义的所有容器。即使只是想启动mongo_instance
容器,mongo_data
容器也会被创建,因为mongo_instance
依赖于mongo_data
,所以在mongo_instance
存在的情况下运行docker-compose rm
会同时删除这两个容器。
解决方法是检查是否运行了docker-compose rm
或docker-compose rm -f
命令,并确保不再运行这些命令。另外,可以检查bash
历史记录中的命令,确认是否有意或无意地删除了容器。
原文链接: https://stackoverflow.com/questions/44221595
我的Docker数据容器是空的问题的原因是,Docker Compose在某个阶段决定重新创建了数据容器。解决方法是在Compose文件之外定义数据容器,使用docker run --name mongo_data mongodb echo "Data Container"
命令创建数据容器,并将Compose文件中的mongo_data
条目删除。
另外一种解决方法是,在启动Docker容器时使用-v
参数来显式定义一个目录作为卷的路径,例如-v /opt/mongo_data:/mongodb
,这样可以方便地使用相同的数据重新创建新的容器。
文章的最后,作者决定放弃使用数据容器,一方面是因为希望将所有内容都保持在.yml文件中,另一方面是对数据安全性的担忧。