“volumes”如何使用 docker-compose 覆盖 docker 镜像的原始文件?

2024-03-09

让我们用这个docker-compose.yml:

version: '2'
services:
   db:
     image: mysql:5.7
     volumes:
       - ./mysql:/var/lib/mysql                # <- important
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - ./wp:/var/www/html                    # <- important
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

我注意到:

  • 做的时候

    mkdir wp
    docker-compose up
    # create a basic Wordpress website from the browser
    # stop the containers from the command-line with CTRL+C
    

    then, ./wp/(最初为空)填充有新的 Wordpress 文件 (**)。这个是正常的。

  • 那么我们来做吧

     docker rm wordpress_1 db_1   # remove the existing containers but keep 
                                  # ./wp/ as it has been created in the previous step (**)
     docker-compose up
    

    在重新创建容器的过程中,./wp/ 不会被新的 WordPress 文件覆盖,而是保留上一步 (**) 中的先前文件!为什么?

    它怎么神奇地知道newWordPress 文件应该not可以写,但是应该保留以前的文件吗?

问: 怎么办docker决定是否/hostdir/:/containerdir/列于volumes:是否应该覆盖原始 docker 映像中已存在的文件?


使用该语法绑定挂载always覆盖图像中存在的文件。这与普通 Linux 的行为方式相同mount(8) 命令:如果您在源目录的一部分上安装了 USB 磁盘之类的东西,则安装的设备的内容会隐藏文件系统中最初的内容,并且所有读取和写入都会使用安装的设备。

当容器启动时,这意味着它可以查看其数据目录是否为空,如果是,则在其中安装一些初始数据。你引用了码头工人中心wordpress image https://hub.docker.com/_/wordpress;有一个入口点脚本 https://github.com/docker-library/wordpress/blob/b1127748deb2db34e9b1306489e24eb49720454f/php7.2/apache/docker-entrypoint.sh有明确的检查

if [ ! -e index.php ] && [ ! -e wp-includes/version.php ]; then
    echo >&2 "WordPress not found in $PWD - copying now..."
    # ... some code that creates sourceTarArgs and targetTarArgs ...
    tar "${sourceTarArgs[@]}" . | tar "${targetTarArgs[@]}"
    echo >&2 "Complete! WordPress has been successfully copied to $PWD"
fi

The mysqlimage 有类似的检查来查看其数据目录是否为空。如果是,它会进行第一次初始化,包括处理/docker-entrypoint-initdb.d目录;如果不是,则假定那里已有数据并完全跳过初始化步骤。

一般来说,您应该尝试为实际数据保留绑定安装和类似的卷,而不是在那里复制代码。在这种情况下wordpress映像,因为它在卷中创建应用程序的副本,所以如果您尝试升级基础映像,会发生什么并不完全明显:卷优先,升级可能会被忽略。

命名 Docker 卷(与绑定安装不同)将从底层映像复制内容,但是only如果它是命名卷而不是其他类型的安装,only在 Docker 本身上(不在 Kubernetes 中),以及only如果卷完全为空(这是您第一次运行容器)。避免依赖此行为,因为它不是特别可移植并且会忽略底层映像中的更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“volumes”如何使用 docker-compose 覆盖 docker 镜像的原始文件? 的相关文章

随机推荐