如何在卷中挂载单个文件

新手上路,请多包涵

我正在尝试 dockerize 一个 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 文件夹。不是文件。

还是有另一种方式来持久化配置?

原文由 Jakub Juszczak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

原文由 BlackStork 发布,翻译遵循 CC BY-SA 4.0 许可协议

我一直在遭受类似的问题。我试图将我的配置文件导入到我的容器中,以便每次需要时都可以修复它,而无需重新构建映像。

我的意思是我认为下面的命令会将 $(pwd)/config.py 从 Docker 主机映射到 /root/app/config.py 作为文件到容器中。

 docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

但是,它总是创建一个名为 config.py 的目录,而不是文件。

在寻找线索时,我找到了原因(从 这里

如果您使用 -v 或 –volume 绑定挂载 Docker 主机上尚不存在的文件或目录,-v 将为您创建端点。 _它总是被创建为一个目录_。

因此,它总是被创建为一个目录,因为我的 docker 主机没有 $(pwd)/config.py

即使我在 docker 主机中创建 config.py。 $(pwd)/config.py 只是覆盖 /root/app/config.py 不导出 /root/app/config.py

原文由 SangminKim 发布,翻译遵循 CC BY-SA 3.0 许可协议