Docker启动卡住求助:自定义镜像挂载卷异常及绑定参数问题
Docker Compose 卷挂载问题排查与解决
容器持续处于「creating」状态的排查步骤
- 先查看容器启动日志,定位具体错误:
常见触发原因包括宿主机路径不存在、权限不足、SELinux限制(Linux系统下)。docker-compose logs -f <你的服务名,比如mariadb/wordpress/nginx> - 手动创建宿主机数据目录并配置正确权限:
mkdir -p ${HOME}/data/mariadb ${HOME}/data/wordpress ${HOME}/data/nginx # 根据容器内运行用户设置权限,比如WordPress常用www-data,UID通常为33 chown -R 33:33 ${HOME}/data/wordpress chmod -R 755 ${HOME}/data
指定路径挂载清空镜像目录的解决方法
Bind mount(宿主机路径:容器路径)的默认行为就是用宿主机目录覆盖容器内目录,若宿主机目录为空,自然会清空容器内原有内容。解决思路:
- 临时启动容器不挂载卷,把镜像内的默认内容复制到宿主机:
# 先启动服务但不挂载卷 docker-compose run --rm wordpress bash # 在另一个终端把容器内的内容复制出来 docker cp <临时容器ID>:/var/www/html ${HOME}/data/ - 或者在Dockerfile中把核心内容复制到备用目录,启动时用脚本同步到挂载目录(比如WordPress的wp-content):
# Dockerfile中添加 COPY wp-content /tmp/wp-content # 启动脚本中添加 if [ ! -d /var/www/html/wp-content ]; then cp -r /tmp/wp-content /var/www/html/ fi
driver_opts配置导致循环启动的修正
这种写法容易因路径格式、权限问题触发容器重启循环,建议直接用简化的bind mount格式:
# docker-compose.yml中的volumes配置 services: mariadb: build: ./mariadb volumes: - ${HOME}/data/mariadb:/var/lib/mysql wordpress: build: ./wordpress volumes: - ${HOME}/data/wordpress:/var/www/html nginx: build: ./nginx volumes: - ${HOME}/data/nginx:/etc/nginx/conf.d
如果坚持用driver_opts,必须保证device是绝对路径,且宿主机目录已存在:
volumes: mariadb_data: driver_opts: type: none o: bind device: ${HOME}/data/mariadb services: mariadb: build: ./mariadb volumes: - mariadb_data:/var/lib/mysql
可用的Makefile示例
# Makefile .PHONY: start stop logs clean start: docker-compose up -d --build stop: docker-compose down logs: docker-compose logs -f clean: docker-compose down -v
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

