gpt4 book ai didi

docker-compose 主机和容器上的持久数据

转载 作者:行者123 更新时间:2023-12-02 19:08:41 24 4
gpt4 key购买 nike

我对 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_save 而不是/data。然后,如果目录为空,它会将/data_save 复制到您的卷/data。如果卷根本没有映射,那么它只是创建一个从/data 到/data_save 的符号链接(symbolic link)。最后一行运行 CMD从您的 Dockerfile 或 docker run cli 好像入口点不存在一样。添加到 Dockerfile 的行如下所示:
    COPY entrypoint.sh /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]

    关于docker-compose 主机和容器上的持久数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575369/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com