docker工人 – 在主机和容器上组成永久性数据

在docker-compose yml 3.0+中,我遇到了一个问题

所以我知道一个卷的行为就像一个挂载..但我已经build立了一个wiki,当我在docker-compose中设置一个卷时,容器上的数据将被删除(隐藏)

那么如何将数据从我的容器保存到我的主机,并在下次启动容器时,它将会覆盖我保存的数据。

所以现在的情况是:我从“docker-compose up –build”开始,创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 

这听起来像你正在使用一个主机卷,你将主机目录映射到容器。 当你这样做的时候,在你的图像中的那个位置上的任何东西都将不可见,只有主机上存在的文件是可见的。

如果您想从图像中获取文件的副本以初始化音量,则有两种select:

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

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

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

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