一尘不染

如何在卷中装载单个文件

docker

我正在尝试将php应用程序码头化。在dockerfile中,我下载了存档,将其解压缩等。

一切正常,但是如果发布了新版本,并且我更新了dockerfile,则必须重新安装该应用程序,因为config.php被覆盖了。

因此,我以为可以像将数据库一样将文件挂载为卷。

我尝试了两种方式,分别是体积和直接路径。

码头工人组成:

version: '2'
services:
  app:
    build: src
    ports:
      - "8080:80"
    depends_on:
      - mysql
    volumes:
      -  app-conf:/var/www/html/upload
      -  app-conf:/var/www/html/config.php
    environment:
      DB_TYPE: mysql
      DB_MANAGER: MysqlManager

  mysql:
    image: mysql:5.6
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:

volumes:
  mysqldata:
  app-conf:

导致错误:

我尝试使用给定的路径(已安装的卷)进行尝试。

/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php

但是,这两种方式均无效。使用已装载的卷,我看到已创建上传。

但随后失败

/var/www/html/config.php \\“导致\\”不是目录\\“ \”“

如果我尝试

/src/docker/myapp/upload/config.php:/var/www/html/config.php

Docker创建上载文件夹,然后创建config.php文件夹。不是文件。

还是有另一种方法来保留配置?


阅读 215

收藏
2020-06-17

共1个答案

一尘不染

TL; DR /通知:

如果您遇到尝试创建的目录来代替要挂载的文件,则可能无法提供 有效绝对的 路径。这是一个无声且令人困惑的故障模式的常见错误。

在docker中以这种方式完成文件卷(绝​​对路径示例(可以使用env变量),并且您需要提及文件名):

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

您也可以:

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

如果您从/src/docker/myapp文件夹中触发docker-compose

2020-06-17