Docker数据卷容器。 我似乎无法得到备份

阅读这些链接:

  1. https://docs.docker.com/userguide/dockervolumes/#backup-restore-or-migrate-data-volumes
  2. 备份机器上的数据卷容器

我的理解是我可以拿一个数据卷容器并存档它的备份。 然而,阅读第一个链接,我似乎无法得到它的工作。

docker create -v /sonatype-work --name sonatype-work sonatype/nexus /bin/true 

我使用以下命令在容器中启动sonatype / nexus图像:

 --volumes-from sonatype-nexus 

所有好的,在运行连接之后,我检查数据量,我可以看到内部创build的,并停止和移除连接并重新开始,所有的变化保存。

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f84abb054d2e sonatype/nexus "/bin/sh -c 'java -" 22 seconds ago Up 21 seconds 0.0.0.0:8081->8081/tcp nexus 1aea2674e482 sonatype/nexus "/bin/true" 25 seconds ago Created sonatype-work 

我想现在备份sonatype工作,但没有运气。

 [root@ansible22 ~]# pwd /root [root@ansible22 ~]# docker run --volumes-from sonatype-work -v $(pwd):/backup ubuntu tar cvf /backup/sonatype-work-backup.tar /sonatype-work tar: /backup/sonatype-work-backup.tar: Cannot open: Permission denied tar: Error is not recoverable: exiting now 

我曾尝试运行为-u根,我也试过:

 /root/sonatype-work-backup.tar 

这样做时,我可以看到它的东西,但我没有看到tar文件。 基于这个例子和我的理解,我不认为这是正确的。

任何人都可以看到我做错了什么?

编辑:Linux版本信息

 Fedora release 22 (Twenty Two) NAME=Fedora VERSION="22 (Twenty Two)" ID=fedora VERSION_ID=22 PRETTY_NAME="Fedora 22 (Twenty Two)" ANSI_COLOR="0;34" CPE_NAME="cpe:/o:fedoraproject:fedora:22" HOME_URL="https://fedoraproject.org/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Fedora" REDHAT_BUGZILLA_PRODUCT_VERSION=22 REDHAT_SUPPORT_PRODUCT="Fedora" REDHAT_SUPPORT_PRODUCT_VERSION=22 PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy VARIANT="Server Edition" VARIANT_ID=server Fedora release 22 (Twenty Two) Fedora release 22 (Twenty Two) 

其原因与selinux标签有关。 这里有几个很好的Project Atomic页面:

Docker和Linux

受限容器进程的默认types是svirt_lxc_net_t。 这种types允许读取和执行/ usr下的所有文件types,以及/ etc下的大多数types。 允许svirt_lxc_net_t使用networking,但不允许读取/ var,/ home,/ root,/ mnt下的内容。svirt_lxc_net_t被允许只写入标记为svirt_sandbox_file_t和docker_var_lib_t的文件。 容器中的所有文件都默认标记为svirt_sandbox_file_t。

然后在Docker中使用卷可能会导致SELinux出现问题 :

这将使用容器将运行的MCS标签来标记容器内的内容,基本上它会运行chcon -Rt svirt_sandbox_file_t -l s0:c1,c2 /var/db其中s0:c1,c2对于每个容器chcon -Rt svirt_sandbox_file_t -l s0:c1,c2 /var/db

(在这种情况下不是/var/db而是/root

如果您使用-v / SOURCE:/ DESTINATION批量安装映像:z docker会自动将您的内容重新标记为s0。 如果使用Z进行批量安装,则标签将特定于容器,并且不能在容器之间共享。

所以在这种情况下, zZ是合适的,但是通常可以selectZ作为隔离。

我被拒绝的原因是因为selinux。 我不知道为什么,但如果我发现,将编辑这个答案。 禁用selinux并重新启动,我能够采取备份。