Docker挂载顺序不正确,不允许我挂载目录

时间:2018-06-27 08:10:49

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

我的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目录内没有与主机相同的内容。

当我做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上会出现此问题

1 个答案:

答案 0 :(得分: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中生成了一个未命名的卷 这样做是为了避免在容器退出时丢失所有生成的信息。是保持数据一致性的一种方法。 因此,如果最初在your_file.txt中只有一个文件./wp-content,则在wordpress开始后, wordpress wp-content中创建以下目录/文件如果不存在:  -index.php  -插件/  -主题/ 您在./wp内容中应该具有与docker-compose -d up之前相同的信息,以及这些由wordpress生成的文件和dirs,因为要在已经存在的子文件夹中装入绑定卷WordPress图片安装的音量。