我正在尝试dockerize一个PHP应用程序。在dockerfile中,我下载存档,提取它,等等。

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

因此,我认为我可以将该文件作为卷挂载,就像对数据库所做的那样。

我尝试了两种方法,用音量和直接路径。

docker-compose:

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创建upload文件夹,然后创建config.php文件夹。不是文件。

或者是否有另一种方法来持久化配置?


当前回答

也许这能帮到别人。

我遇到了这个问题,试过了所有方法。卷绑定看起来很好,即使我挂载了目录(而不是文件),我在挂载目录中的文件名是正确的,但挂载为dirs。

我尝试重新启用共享驱动器,Docker抱怨防火墙是活动的。

在禁用防火墙后,一切工作正常。

其他回答

TL;博士/注意: 如果您遇到在您试图挂载的文件的位置创建了一个目录,那么您可能无法提供有效的绝对路径。这是沉默和令人困惑的失败模式的常见错误。

文件卷在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

您可以挂载文件或目录/文件夹,这完全取决于源文件或目录。你还需要提供完整的路径或者如果你不确定你可以使用PWD。下面是一个简单的工作示例。

在这个例子中,我挂载了工作目录中已经存在的env-commands文件

$ docker run  --rm -it -v ${PWD}/env-commands:/env-commands aravindgv/eosdt:1.0.5 /bin/bash -c "cat /env-commands"

我也曾有过类似的问题。我试图将我的配置文件导入到我的容器中,这样我就可以在每次需要时修复它,而无需重新构建映像。

我的意思是,我认为下面的命令会将$(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。

对我来说,问题是我试图挂载到容器中的文件上有一个损坏的符号链接

我的Windows 8.1也有同样的问题

结果证明,这是由于路径的大小写敏感性。 我调用docker-compose up从目录cd /c/users/alex/和容器内的一个文件被转换到目录。

但是当我执行cd /c/Users/alex/(不是大写的Users)并从那里调用docker-compose时,它工作了。

在我的系统中,Users dir和Alex dir都是大写的,尽管看起来只有Users dir重要。