【问题标题】:Docker mount order out of sequence and not letting me mount my directoryDocker挂载顺序乱序,不让我挂载我的目录
【发布时间】:2018-06-27 08:10:48
【问题描述】:

我的 docker-compose.yml 如下

version: '3.3'

services:
   db:
     image: mysql:5.7
     container_name: mysql-wordpress
     volumes:
       - db_data:/var/lib/mysql
     ports:
       - "3300:3306"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     container_name: wordpress
     depends_on:
       - db
     image: wordpress:latest
     volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
     ports:
       - "80:80"
       - "443:443"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

   phpmyadmin:
      image: phpmyadmin/phpmyadmin
      container_name: phpmyadmin
      depends_on:
         - db
      restart: always
      ports:
         - "8080:80"
      environment:
        - PMA_ARBITRARY=1

volumes:
    db_data:

当我开始docker-compose up -d

wp-content目录与容器wp-content目录内的host内容不同。

当我做docker inspect WordPress:

"Mounts": [
        {
            "Type": "bind",
            "Source": "/rootfs/home/rancher/projects/tabletop/uploads.ini",
            "Destination": "/usr/local/etc/php/conf.d/uploads.ini",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Type": "bind",
            "Source": "/rootfs/home/rancher/projects/tabletop/wp-content",
            "Destination": "/var/www/html/wp-content",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Type": "volume",
            "Name": "d0a4f5ad342db0db782b41dd676aa0e58a324b5e7db1e56086bca5550a9ffdc3",
            "Source": "/var/lib/docker/volumes/d0a4f5ad342db0db782b41dd676aa0e58a324b5e7db1e56086bca5550a9ffdc3/_data",
            "Destination": "/var/www/html",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }

似乎第三个挂载可能覆盖了我的绑定挂载。但我不知道它来自哪里。我怎样才能在它之后挂载我的 wp-content?

更新: 这个问题只发生在 rancherOS 、 coreOS 和 linux Mint 上,它工作正常

【问题讨论】:

  • 尝试添加- wp-html:/var/www/html 作为第一个命名卷映射,看看是否有帮助?如果需要,定义 wp-html
  • @TarunLalwani 尝试了它仍然没有工作,尽管我已经定义了它,但它最终添加了命名值。
  • 我真的什么都不知道,但我在 docker-compose 中注意到您有容器名称“wordpress”,但您使用容器名称“WordPress”进行检查。容器名称是否区分大小写 - 在这种情况下,您正在查看错误的容器。如果它们不敏感并且您确定它们是同一个cluld,您可以编辑问题以消除来源和混淆。

标签: docker docker-compose bind docker-volume rancheros


【解决方案1】:

首先,你知道你可以创建两种类型的卷(让我们忽略这个解释 tmpfs):

  • 绑定型卷
  • 卷型卷
    • 命名卷。
    • 未命名的卷。

当您创建绑定类型时,它完成了两个目录或文件之间的关联。

当您在内部创建卷类型时,它也会在 /var/lib/docker/volumes//_data 和目标之间进行绑定。 可以是您给出的字符串(命名卷)或类似您的字符串:d0a4f5ad342db0db782b...(未命名卷)

所以,您已经从主机中的本地目录创建了两个绑定卷 ./wp-contend 还有一个用于 uploads.ini 文件的绑定卷。 一切正常。

关键是您从image: wordpress:latest 继承了一个未命名的卷。

如果你有用于生成 wordpress:latest 的 Dockerfile,你会看到如下一行:

VOLUME [/var/www/html]

所以,它在/var/lib/docker/volumes/d0a4f5ad342db0db782b41dd676aa0e58a324b5e7db1e56086bca5550a9ffdc3/_data 中生成了一个未命名的卷 这样做是为了避免在容器退出时丢失所有生成的信息。是一种保持数据一致性的方法。 因此,如果您最初在 ./wp-content 中有一个文件 your_file.txt,则在 wordpress 启动后,wordpresswp-content 中创建以下目录/文件(如果不存在): - 索引.php - 插件/ - 主题/ 您的 ./wp-content 中应该有与 docker-compose -d up 之前相同的信息以及这些由 wordpress 生成的文件和目录,因为您正在将绑定卷安装在已安装的子文件夹中来自 wordpress 图片的音量。

【讨论】:

  • 感谢您的详细解释,那么有什么方法可以将绑定卷挂载到未命名的卷上?
  • 如果你挂载了/var/www/html,你可以覆盖卷,但是如果你在里面挂载另一个文件夹,原来的VOLUME [/var/www/html]仍然存在。
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2019-05-18
  • 2016-06-10
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多