sonatype nexus docker音量错误

Gim*_*mbo 5 nexus sonatype docker

我正在尝试使用docker安装sonatype-nexus,并希望/opt/sonatype-work与主机(linux ubuntu 14.04)共享docker nexus repo /opt/nexus.

我的dockerfile:

FROM centos:6

MAINTAINER Marcel Birkner <marcel.birkner@codecentric.de>

USER root
# Update the system
RUN yum -y update; \
    yum clean all

##########################################################
# Install Java JDK, SSH and other useful cmdline utilities
##########################################################
RUN yum -y install java-1.7.0-openjdk-devel \
    which \
    telnet \
    unzip \
    openssh-server \
    sudo \
    openssh-clients \
    iputils \
    iproute \
    httpd-tools \
    wget \
    tar; \
    yum clean all
ENV JAVA_HOME /usr/lib/jvm/jre

##########################################################
# Install Nexus
##########################################################
RUN mkdir -p /opt/sonatype-nexus /opt/sonatype-work
RUN wget -O /tmp/nexus-latest-bundle.tar.gz http://www.sonatype.org/downloads/nexus-latest-bundle.tar.gz
RUN tar xzvf /tmp/nexus-latest-bundle.tar.gz -C /opt/sonatype-nexus --strip-components=1
RUN useradd --user-group --system --home-dir /opt/sonatype-nexus nexus

ADD nexus.xml /opt/sonatype-work/nexus/conf/nexus.xml

RUN chown -R nexus:nexus /opt/sonatype-work /opt/sonatype-nexus

ENV NEXUS_WEBAPP_CONTEXT_PATH /nexus
RUN echo "#!/bin/bash" > /opt/start-nexus.sh
RUN echo "su -c \"/opt/sonatype-nexus/bin/nexus console\" - nexus" >> /opt/start-nexus.sh
RUN chmod +x /opt/start-nexus.sh
VOLUME /opt/sonatype-work
CMD ["/opt/start-nexus.sh"]
EXPOSE 8081
Run Code Online (Sandbox Code Playgroud)

当我构建这个图像(构建成功):

docker build -t sonatype/nexus .
Run Code Online (Sandbox Code Playgroud)

然后我通过这个命令运行它:

docker run -d -p 8081:8081 --name nexus -v /opt/nexus:/opt/sonatype-work sonatype/nexus
Run Code Online (Sandbox Code Playgroud)

它立即启动并停止错误显示(docker logs nexus):

nexus_1 | jvm 1    | Caused by: java.nio.file.AccessDeniedException: /opt/sonatype-work/nexus
nexus_1 | jvm 1    |    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:383) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at java.nio.file.Files.createDirectory(Files.java:630) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:734) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at java.nio.file.Files.createDirectories(Files.java:720) ~[na:1.7.0_99]
nexus_1 | jvm 1    |    at org.sonatype.nexus.util.file.DirSupport.mkdir(DirSupport.java:146) ~[na:na]
nexus_1 | jvm 1    |    at org.sonatype.nexus.util.file.DirSupport.mkdir(DirSupport.java:162) ~[na:na]
nexus_1 | jvm 1    |    at org.sonatype.nexus.webapp.WebappBootstrap.contextInitialized(WebappBootstrap.java:115) ~[na:na]
nexus_1 | jvm 1    |    ... 16 common frames omitted
nexus_1 | wrapper  | <-- Wrapper Stopped
Run Code Online (Sandbox Code Playgroud)

如果我VOLUME /opt/sonatype-nexus从dockerfile中删除它工作正常.

你知道什么可能导致这个问题吗?以及如何解决它?

tha*_*tah 9

如果在容器中绑定安装主机目录,则主机目录中的文件和目录优先,并挂载在容器映像中已存在的文件上.换句话说,他们"掩盖"容器内的东西.

绑定装置保留对主机上存在的目录的权限,如果主机上没有目录,则Docker使用root:root所有者创建它.

看看useradd nexus你的Dockerfile,我怀疑start-nexus.sh与该用户运行nexus,因此它可能没有绑定挂载目录(由root拥有)的权限.您可以通过chowning目录将其修复到nexus容器内部的数字uid/gid .

要获取该用户的uid/ gid,以交互方式启动容器;

docker run -it --rm sonatype/nexus bash
Run Code Online (Sandbox Code Playgroud)

在shell中请求uid/gid:

id nexus
Run Code Online (Sandbox Code Playgroud)

这给你的东西:

uid=123(nexus) gid=456(nexus) groups=456(nexus)
Run Code Online (Sandbox Code Playgroud)

现在退出容器(exit),并使用uid/gid在主机上chown目录;

sudo chown -R 123:456 /opt/nexus
Run Code Online (Sandbox Code Playgroud)

我注意到的一些事情

看起来您正在构建自己的sonatype nexus图像的自定义版本,但使用与官方图像(sonatype/nexus)相同的名称.我建议不要这样做,并给它自己的名字(例如mycompany/nexus); 这可以防止混淆,并且如果有人跑步,也可以防止您自己的图像被官方图像覆盖docker pull sonatype/nexus.

有没有理由不使用官方形象?一般来说,建议使用官方图像,因为它们是由软件的维护者(在这种情况下是sonatype)维护的,所以应该给你一个最新(和维护)的软件版本; https://hub.docker.com/r/sonatype/nexus/