让我们用这个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 mysql
image 有类似的检查来查看其数据目录是否为空。如果是,它会进行第一次初始化,包括处理/docker-entrypoint-initdb.d
目录;如果不是,则假定那里已有数据并完全跳过初始化步骤。
一般来说,您应该尝试为实际数据保留绑定安装和类似的卷,而不是在那里复制代码。在这种情况下wordpress
映像,因为它在卷中创建应用程序的副本,所以如果您尝试升级基础映像,会发生什么并不完全明显:卷优先,升级可能会被忽略。
命名 Docker 卷(与绑定安装不同)将从底层映像复制内容,但是only如果它是命名卷而不是其他类型的安装,only在 Docker 本身上(不在 Kubernetes 中),以及only如果卷完全为空(这是您第一次运行容器)。避免依赖此行为,因为它不是特别可移植并且会忽略底层映像中的更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)