2017-06-15 191 views
0

持久化数据我有在泊坞窗,撰写阳明海运量的问题3.0+搬运工,撰写主机和容器

所以我知道,一个卷的行为与安装。但我已成立了一个wiki和时我在docker-compose中设置了一个卷,容器上的数据将被删除(隐藏)

那么如何将我的容器中的数据首先保存到我的主机中,而下一次启动容器时,它只会覆盖我保存的数据。

所以目前的情况是: 我以“docker-compose up --build”开头,并创建一个卷(空)并将其复制到容器中。容器上该文件夹中的所有内容都将被删除结果

泊坞窗,compose.yml

version: '3.1' 

services: 

    doku-wiki: 
    build: . 
    ports: 
     - '4000:80' 

Dockerfile

FROM php:7.1-apache 
COPY dokuwiki-stable /var/www/html/ 
COPY entrypoint.sh /entrypoint.sh 
RUN chmod 777 /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
EXPOSE 80 
+0

您能澄清一下问题吗?您是否正在寻找一种“在容器启动时将现有容器数据复制到卷上”的方法? –

+0

是的,我第一次通过码头启动容器 - 编写它应该将现有的容器数据复制到一个卷。之后,容器应该使用卷中的日期而不会覆盖所有内容。 例如,我想要备份文件夹“/ data/pages /” 但是在第一次启动时,备份卷将为空白,并且它不会将任何内容复制到/ data/pages /,但会删除现有内容容器 – Bvz

+0

我在docker-compose.yml文件中看不到任何卷定义。数量在哪里起作用? – programmerq

回答

1

这听起来像你正在使用一台主机的体积,你映射主机目录放入容器中。当你这样做时,你的图像中该位置的任何内容都将不可见,只有主机上存在的文件才可见。

如果你想拥有的文件的副本,从图像中初始化体积内,你有两个选择:

  1. 切换到指定的体积。 Docker会自动初始化这些到图像的内容,包括任何权限。如果您不需要直接访问Docker以外的文件,则这是首选解决方案。

  2. 更改图像入口点以及在图像中存储文件的位置。

在第二个选项,如果你想/数据,以对您的应用程序数量,你可以有,做一个entrypoint.sh:

#!/bin/sh 

if [ ! -d "/data" ]; then 
    ln -s /data_save /data 
elif [ -z "$(ls -A /data)" ]; then 
    cp -a /data_save/. /data/ 
fi 
exec "[email protected]" 

你的图像需要保存所有初始文件到/ data_save而不是/ data。然后,如果目录是空的,它会为你的卷/数据做一个/ data_save的拷贝。如果卷根本没有映射,那么它只是创建从/ data到/ data_save的符号链接。最后一行从您的Dockerfile或docker run cli运行CMD,就好像入口点没有在那里一样。添加到您的Dockerfile中的行如下所示:

COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
+0

非常感谢您的帮助。我试过了入口点。sh脚本,但当我用docker-compose启动容器时出现以下错误 “doku-wiki_1 | standard_init_linux.go:178:exec用户进程导致”没有这样的文件或目录“” – Bvz

+0

我是否需要任何卷解? – Bvz

+0

“没有这样的文件或目录”意味着文件没有被复制到图像中,或者第一行指向容器上不存在的东西('/ bin/sh')。我也在脚本中用windows换行符看过。第二种解决方案适用于您当前的主机卷。 – BMitch