【问题标题】:docker-compose persistent data on host and containerdocker-compose 主机和容器上的持久数据
【发布时间】:2017-06-15 19:22:42
【问题描述】:

我在 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-compose up 启动容器时,它应该将现有容器数据复制到一个卷中。之后,容器应该使用卷中的日期而不覆盖所有内容。例如我想备份文件夹“/data/pages/”但是在第一次启动时备份卷将是空的..它不会复制任何内容到/data/pages/但会删除容器的现有内容
  • 我在您的 docker-compose.yml 文件中看不到任何卷定义。音量在哪里起作用?

标签: docker copy containers persistence docker-compose


【解决方案1】:

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

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

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

  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 复制到您的卷 /data。如果卷根本没有被映射,那么它只会创建一个从 /data 到 /data_save 的符号链接。最后一行从 Dockerfile 或 docker run cli 运行 CMD,就好像入口点不存在一样。添加到 Dockerfile 的行如下所示:

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

【讨论】:

  • 非常感谢您的帮助。我尝试了 entrypoint.sh 脚本,但使用 docker-compose "doku-wiki_1 | standard_init_linux.go:178: exec user process cause "no such file or directory"" 启动容器时出现以下错误
  • 第二个解决方案是否需要任何卷?
  • "没有这样的文件或目录"意味着文件没有被复制到图像中,或者第一行指向容器上不存在的东西 (/bin/sh)。我还在脚本中看到了 Windows 换行符。第二种解决方案适用于您当前的主机卷。
  • 刚刚将我的 docker-compose 和 dockerfile 添加到该主题。步骤 3/6:复制 entrypoint.sh /entrypoint.sh ---> 使用缓存 ---> a33d89753408 步骤 4/6:运行 chmod 777 /entrypoint.sh ---> 使用缓存 ---> ada6d8df380d 步骤 5/ 6 : ENTRYPOINT /entrypoint.sh ---> 使用缓存 ---> 645f6e69f994 创建 development_doku-wiki_1 附加到 development_doku-wiki_1 development_doku-wiki_1 exited with code 0 我将脚本的行尾更改为“LF”。我现在不再收到错误,但容器将退出。再次感谢您的时间和帮助.. 我认为我非常接近...
  • 由于您使用的是 php:7.1-apache 基础映像,它已经有一个入口点,您需要从您的入口点调用他们的入口点。脚本的最后一行应为 exec docker-php-entrypoint "$@"
猜你喜欢
  • 2016-12-20
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多