为什么 docker 容器无法在挂载的文件夹中创建文件夹
Why docker container can't create folders in mounted folders
我正在尝试使用 Docker version 1.9.1, build a34a1d5
在 MacOS 上启动 docker.bintray.io/jfrog/artifactory-oss:4.11.1
他们的指南建议将数据和配置文件夹映射到主机以使其持久化,这是合理的建议:https://www.jfrog.com/confluence/display/RTF/Running+with+Docker#RunningwithDocker-RunningArtifactoryasaDockerPrivateRegistry
问题是容器没有启动。它抱怨来自已安装卷的文件无法在已安装卷中创建特定于工件的文件夹和文件
/usr/bin/java
Starting Artifactory tomcat as user artifactory...
Max number of open files: 1048576
Using ARTIFACTORY_HOME: /var/opt/jfrog/artifactory
Using ARTIFACTORY_PID: /var/opt/jfrog/run/artifactory.pid
touch: cannot touch `/opt/jfrog/artifactory/tomcat/logs/catalina.out': Permission denied
/opt/jfrog/artifactory/tomcat/bin/catalina.sh: line 401: /opt/jfrog/artifactory/tomcat/logs/catalina.out: Permission denied
** ERROR: Artifactory Tomcat server did not start. Please check the logs
我的 docker 命令看起来像:
export ARTIFACTORY_HOME=$HOME/local.artifactory
# just cleanup for now
rm -rf $ARTIFACTORY_HOME
docker run -d --name local.artifactory \
--hostname local.artifactory \
--privileged=true \
-p 80:80 \
-p 8081:8081 \
-p 443:443 \
-v $ARTIFACTORY_HOME/data:/var/opt/jfrog/artifactory/data \
-v $ARTIFACTORY_HOME/logs:/var/opt/jfrog/artifactory/logs \
-v $ARTIFACTORY_HOME/backup:/var/opt/jfrog/artifactory/backup \
-v $ARTIFACTORY_HOME/etc:/var/opt/jfrog/artifactory/etc \
docker.bintray.io/jfrog/artifactory-oss:4.11.1
当我将挂载的卷设置为 /tmp
export ARTIFACTORY_HOME=/tmp/local.artifactory
docker 容器启动,但我的安装出现在 docker-machine VM 上,我可以访问它们...
当您挂载一个当前不存在的主机卷时,该文件夹将被创建并以 root 权限挂载(使用默认的 umask,即 755)。解决方法是在清理步骤后创建数据、日志等...文件夹,并为它们配置可写入容器 uid 的权限。
以下是您遇到问题的示例:
$ docker run -v $HOME/data/docker/test-missing:/missing -u 100 --rm -it busybox
/ $ ls -al /missing
total 8
drwxr-xr-x 2 root root 4096 Aug 18 19:18 .
drwxr-xr-x 19 root root 4096 Aug 18 19:18 ..
/ $ touch /missing/file
touch: /missing/file: Permission denied
/ $ exit
$ ls -al $HOME/data/docker/test-missing/
total 8
drwxr-xr-x 2 root root 4096 Aug 18 15:18 .
drwxr-xr-x 31 bmitch bmitch 4096 Aug 18 15:18 ..
要在 rm
和 docker run
之间添加以修复脚本的行是:
mkdir -p $ARTIFACTORY_HOME/data $ARTIFACTORY_HOME/logs \
$ARTIFACTORY_HOME/backup $ARTIFACTORY_HOME/etc
chmod -R 777 $ARTIFACTORY_HOME/data $ARTIFACTORY_HOME/logs \
$ARTIFACTORY_HOME/backup $ARTIFACTORY_HOME/etc
请注意,第二个命令不推荐用于多用户环境,它允许任何人读取和写入文件夹。更好的方案是将owner改为容器使用的uid,用户的gid,mode 775,或者将host用户添加到容器内部的gid中,权限相同。但是,如果您不想在单个用户系统上陷入 uid 和 gid 的复杂性,777 是快速的解决方案。
编辑:在 MacOS 或 Windows 上使用 Docker,您还需要确保作为主机卷装载到容器中的文件夹是也从您的 Mac/Win 机器共享到 Docker Linux VM。在 Windows 的 Docker 和 Mac 的 Docker 中是一个设置菜单,用于调整共享驱动器或目录。在MacOS,注意目录名的大小写。
我正在尝试使用 Docker version 1.9.1, build a34a1d5
docker.bintray.io/jfrog/artifactory-oss:4.11.1
他们的指南建议将数据和配置文件夹映射到主机以使其持久化,这是合理的建议:https://www.jfrog.com/confluence/display/RTF/Running+with+Docker#RunningwithDocker-RunningArtifactoryasaDockerPrivateRegistry
问题是容器没有启动。它抱怨来自已安装卷的文件无法在已安装卷中创建特定于工件的文件夹和文件
/usr/bin/java
Starting Artifactory tomcat as user artifactory...
Max number of open files: 1048576
Using ARTIFACTORY_HOME: /var/opt/jfrog/artifactory
Using ARTIFACTORY_PID: /var/opt/jfrog/run/artifactory.pid
touch: cannot touch `/opt/jfrog/artifactory/tomcat/logs/catalina.out': Permission denied
/opt/jfrog/artifactory/tomcat/bin/catalina.sh: line 401: /opt/jfrog/artifactory/tomcat/logs/catalina.out: Permission denied
** ERROR: Artifactory Tomcat server did not start. Please check the logs
我的 docker 命令看起来像:
export ARTIFACTORY_HOME=$HOME/local.artifactory
# just cleanup for now
rm -rf $ARTIFACTORY_HOME
docker run -d --name local.artifactory \
--hostname local.artifactory \
--privileged=true \
-p 80:80 \
-p 8081:8081 \
-p 443:443 \
-v $ARTIFACTORY_HOME/data:/var/opt/jfrog/artifactory/data \
-v $ARTIFACTORY_HOME/logs:/var/opt/jfrog/artifactory/logs \
-v $ARTIFACTORY_HOME/backup:/var/opt/jfrog/artifactory/backup \
-v $ARTIFACTORY_HOME/etc:/var/opt/jfrog/artifactory/etc \
docker.bintray.io/jfrog/artifactory-oss:4.11.1
当我将挂载的卷设置为 /tmp
export ARTIFACTORY_HOME=/tmp/local.artifactory
docker 容器启动,但我的安装出现在 docker-machine VM 上,我可以访问它们...
当您挂载一个当前不存在的主机卷时,该文件夹将被创建并以 root 权限挂载(使用默认的 umask,即 755)。解决方法是在清理步骤后创建数据、日志等...文件夹,并为它们配置可写入容器 uid 的权限。
以下是您遇到问题的示例:
$ docker run -v $HOME/data/docker/test-missing:/missing -u 100 --rm -it busybox
/ $ ls -al /missing
total 8
drwxr-xr-x 2 root root 4096 Aug 18 19:18 .
drwxr-xr-x 19 root root 4096 Aug 18 19:18 ..
/ $ touch /missing/file
touch: /missing/file: Permission denied
/ $ exit
$ ls -al $HOME/data/docker/test-missing/
total 8
drwxr-xr-x 2 root root 4096 Aug 18 15:18 .
drwxr-xr-x 31 bmitch bmitch 4096 Aug 18 15:18 ..
要在 rm
和 docker run
之间添加以修复脚本的行是:
mkdir -p $ARTIFACTORY_HOME/data $ARTIFACTORY_HOME/logs \
$ARTIFACTORY_HOME/backup $ARTIFACTORY_HOME/etc
chmod -R 777 $ARTIFACTORY_HOME/data $ARTIFACTORY_HOME/logs \
$ARTIFACTORY_HOME/backup $ARTIFACTORY_HOME/etc
请注意,第二个命令不推荐用于多用户环境,它允许任何人读取和写入文件夹。更好的方案是将owner改为容器使用的uid,用户的gid,mode 775,或者将host用户添加到容器内部的gid中,权限相同。但是,如果您不想在单个用户系统上陷入 uid 和 gid 的复杂性,777 是快速的解决方案。
编辑:在 MacOS 或 Windows 上使用 Docker,您还需要确保作为主机卷装载到容器中的文件夹是也从您的 Mac/Win 机器共享到 Docker Linux VM。在 Windows 的 Docker 和 Mac 的 Docker 中是一个设置菜单,用于调整共享驱动器或目录。在MacOS,注意目录名的大小写。