sonatype nexus docker 音量错误
sonatype nexus docker volume error
我正在尝试使用 docker 安装 sonatype-nexus 并希望与主机共享 docker /opt/sonatype-work
nexus repo (linux ubuntu 14.04) /opt/nexus
.
我的docker文件:
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
当我构建此映像时(构建成功):
docker build -t sonatype/nexus .
然后我 运行 它通过这个命令:
docker run -d -p 8081:8081 --name nexus -v /opt/nexus:/opt/sonatype-work sonatype/nexus
它立即启动并立即停止
错误显示 (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
如果我从 docker 文件中删除 VOLUME /opt/sonatype-nexus
,它工作正常。
您知道是什么原因导致了这个问题吗?以及如何修复它?
如果在容器中绑定挂载主机目录,则主机目录中的文件和目录优先并挂载在容器映像中已经存在的文件之上。换句话说,它们 "mask" 容器下面的东西。
绑定挂载保持它们对主机上存在的目录的权限,如果主机上没有目录,Docker 创建它,使用 root:root
作为所有者。
查看您的 Docker 文件中的 useradd nexus
,我怀疑 start-nexus.sh
与该用户一起运行 nexus,因此它可能没有绑定挂载目录的权限(归 root 所有)。您可以通过 chowning
将目录修复为容器内 nexus
的数字 uid/gid。
要获取该用户的 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/
小心 selinux
运行 setenforce 0
如果有帮助,请考虑通过设置永久禁用它
SELINUX=disabled
在
/etc/sysconfig/selinux
配置文件。
我正在尝试使用 docker 安装 sonatype-nexus 并希望与主机共享 docker /opt/sonatype-work
nexus repo (linux ubuntu 14.04) /opt/nexus
.
我的docker文件:
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
当我构建此映像时(构建成功):
docker build -t sonatype/nexus .
然后我 运行 它通过这个命令:
docker run -d -p 8081:8081 --name nexus -v /opt/nexus:/opt/sonatype-work sonatype/nexus
它立即启动并立即停止
错误显示 (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
如果我从 docker 文件中删除 VOLUME /opt/sonatype-nexus
,它工作正常。
您知道是什么原因导致了这个问题吗?以及如何修复它?
如果在容器中绑定挂载主机目录,则主机目录中的文件和目录优先并挂载在容器映像中已经存在的文件之上。换句话说,它们 "mask" 容器下面的东西。
绑定挂载保持它们对主机上存在的目录的权限,如果主机上没有目录,Docker 创建它,使用 root:root
作为所有者。
查看您的 Docker 文件中的 useradd nexus
,我怀疑 start-nexus.sh
与该用户一起运行 nexus,因此它可能没有绑定挂载目录的权限(归 root 所有)。您可以通过 chowning
将目录修复为容器内 nexus
的数字 uid/gid。
要获取该用户的 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;
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/
小心 selinux
运行 setenforce 0
如果有帮助,请考虑通过设置永久禁用它
SELINUX=disabled
在
/etc/sysconfig/selinux
配置文件。