docker在主机和容器上合成持久数据

docker在主机和容器上合成持久数据,docker,copy,containers,persistence,docker-compose,Docker,Copy,Containers,Persistence,Docker Compose,docker compose yml 3.0中的卷有问题+ 所以我知道卷的行为类似于挂载。。但是我已经设置了wiki,当我在docker compose中设置卷时,容器上的数据将被删除(隐藏) 因此,如何首先将容器中的数据保存到主机,下次启动容器时,它将覆盖我保存的数据 因此,目前的情况是: 我从“docker compose up--build”开始,创建一个卷(空)并将其复制到容器中。。因此,容器上该文件夹中的所有内容都将被删除 docker-compose.yml version: '3.

docker compose yml 3.0中的卷有问题+

所以我知道卷的行为类似于挂载。。但是我已经设置了wiki,当我在docker compose中设置卷时,容器上的数据将被删除(隐藏)

因此,如何首先将容器中的数据保存到主机,下次启动容器时,它将覆盖我保存的数据

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

docker-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

听起来您正在使用一个主机卷,将主机目录映射到容器中。执行此操作时,图像中该位置的任何内容都将不可见,仅显示主机上存在的文件

如果要从映像内部获取文件副本以初始化卷,则有两个选项:

  • 切换到命名卷。Docker将自动初始化这些图像的内容,包括任何权限。如果您不需要从docker外部直接访问文件,这是首选解决方案

  • 更改图像入口点和在图像中存储文件的位置

  • 在第二个选项中,如果希望/data成为应用程序的卷,则可以有一个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 "$@"
    
    您的图像需要将所有初始文件保存到/data\u save,而不是/data。然后,如果目录为空,它会将/data\u的副本保存到卷/data中。如果卷根本没有映射,那么它只会创建一个从/data到/data\u save的符号链接。最后一行运行Dockerfile中的
    CMD
    ,或
    docker run
    cli,就好像入口点不在那里一样。添加到Dockerfile的行如下所示:

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

    你能澄清这个问题吗?是否正在寻找“在容器启动时将现有容器数据复制到卷”的方法?是的,第一次通过docker compose up启动容器时,它应该将现有容器数据复制到卷。之后,容器应使用卷中的日期,而不覆盖所有内容。例如,我想备份文件夹“/data/pages/”,但在第一次启动时,备份卷将为空。。它不会将任何内容复制到/data/pages/中,但会删除容器的现有内容。我在docker-compose.yml文件中看不到任何卷定义。音量在哪里发挥作用?非常感谢您的帮助。我尝试了entrypoint.sh脚本,但在使用docker compose“doku-wiki|1 | standard|initúlinux.go:178:exec用户进程启动容器时出现以下错误:“没有这样的文件或目录”“我需要第二个解决方案的任何卷吗?“没有这样的文件或目录”表示文件没有复制到映像中,或者第一行指向容器上不存在的东西(
    /bin/sh
    )。我也在脚本中看到了windows换行。第二个解决方案适用于您当前的主机卷。刚刚将my docker compose和dockerfile添加到该主题中。第3/6步:复制entrypoint.sh/entrypoint.sh->使用缓存-->a33d89753408第4/6步:运行chmod 777/entrypoint.sh->使用缓存-->ada6d8df380d第5/6步:entrypoint/entrypoint.sh->使用缓存-->645f6e69f994创建开发_doku-wiki_1附加到开发_doku-wiki_1开发_-doku-wiki_1退出,代码为0 I将脚本的行尾更改为“LF”。我现在不再得到错误,但容器将退出。再次感谢你的时间和帮助。。我想我非常接近……因为您使用的是php:7.1-apachebase映像,它已经有一个入口点,您需要从您的入口点调用它们的入口点。脚本中的最后一行应该是
    exec docker php入口点“$@”