用FROM mongo:8.0.8
为基础镜像,加了些初始化数据做的mongodb镜像。用podman管理和backend,frontend组成一个简单的BS架构。利用podman创建pod,3个镜像同用一个空间,项目内部连接就可以统一用127.0.0.1加上端口进行通信了。
要使用podman,需要用podman生成镜像,和docker操作一样,在Dockerfile文件目录下面进行```
podman build --progress=plain -t <imgname>:<tag> .
创建好了后用
podman pod create --name <podnam> -p <port_host:port_container> -p <port_host:port_container> ...
创建pod,然后用之前生成的image创建并运行容器,其中,在mongodb的运行过程中
podman run -id --rm --name <container_name> --pod <the pod name> -v <host machine path>:/data/db localhost/<mongo image name>:<mongo image> tag mongod --auth --bind_ip 0.0.0.0
出现了changing ownership of '/data/db..' : Operation not permitted
,或者FileNotOpen, errmsg: Failed to read metadata from /data/db/storage.bson
。
以下是原因和方案:
- mongodb中Dockerfile会创建一个用户名mongodb(uid=999),创建一个用户组mongodb(gid=999)。于是挂载的宿主机目录下的db文件都归属于999
- 宿主机没有999这个用户。当前宿主机的用户是kiramario,uid=1000,gid=1000
- podman中宿主机和容器之间的命名空间有一个映射,比如kiramario用户运行podman run后,容器里面被映射为root(0)但是它不是真root,所以没有权限改归属于999的文件。
- 查看
/etc/subuid
,结果是kiramario:100000:65536
,意思是映射规则是从100000开始,可以映射65536个。容器映射到主机是100000+999-1 = 100998
- 用
podman unshare chown 999:999 <host machine path>
,在宿主机上查看ls -l
发现文件归属是100998,对上了,就有权限了。