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

时间:2017-06-15 19:22:42

标签: docker copy containers persistence docker-compose

我在docker-compose yml 3.0 +

中遇到卷问题

所以我知道一个卷的行为就像一个mount ..但是我已经设置了一个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

1 个答案:

答案 0 :(得分:1)

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

如果您想从图像中获取文件的副本以初始化卷,您有两种选择:

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

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

  3. 在第二个选项中,如果您希望/ 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_save而不是/ data。然后,如果目录为空,它将为您的卷/数据执行/ data_save的副本。如果根本没有映射卷,那么它只是从/ data创建一个符号链接到/ data_save。最后一行从Dockerfile或CMD cli运行docker run,就好像入口点不存在一样。 Dockerfile添加的行如下所示:

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