如果您在容器中绑定挂载主机目录,则主机目录中的文件和目录优先并挂载到容器映像中已存在的文件上。换句话说,它们“掩盖”了容器下面的东西。
绑定挂载保留主机上存在的目录的权限,如果主机上不存在目录,Docker 将使用以下命令创建它:root:root
作为所有者。
看着useradd nexus
在你的 Dockerfile 中,我怀疑start-nexus.sh
使用该用户运行 nexus,因此它可能没有绑定安装目录(由 root 拥有)的权限。您可以通过以下方式修复此问题chowning
数字 uid/gid 的目录nexus
容器内。
为了得到uid
/ gid
该用户以交互方式启动容器;
docker run -it --rm sonatype/nexus bash
在该 shell 内请求 uid/gid:
id nexus
这会给你类似的东西:
uid=123(nexus) gid=456(nexus) groups=456(nexus)
现在退出容器(exit
),并使用 uid/gid chown 主机上的目录;
sudo chown -R 123:456 /opt/nexus
我注意到的一些事情
看起来您正在构建自己的自定义版本的 sonatype nexus 映像,但使用与官方映像相同的名称(sonatype/nexus
)。我建议不要这样做,并给它你自己的名字(例如mycompany/nexus
);这可以防止混乱,也可以防止您自己的混乱
如果有人运行,图像将被官方图像覆盖docker pull sonatype/nexus
.
有什么理由不使用官方图片吗?一般来说,建议使用官方映像,因为它们是由软件维护者(在本例中为 sonatype)维护的,因此应该为您提供该软件的最新(和维护)版本;https://hub.docker.com/r/sonatype/nexus/ https://hub.docker.com/r/sonatype/nexus/