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

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


当前回答

我在Windows上也遇到了同样的问题,Docker 18.66.1 -ce-win73(19507)。

通过Docker设置面板删除并重新添加共享驱动器,一切都恢复正常了。

其他回答

我在Windows上也遇到了同样的问题,Docker 18.66.1 -ce-win73(19507)。

通过Docker设置面板删除并重新添加共享驱动器,一切都恢复正常了。

在合成中,我使用了一个相对路径,它工作:

version: "3.7"
services:
    svc1: 
      volumes:
        # Current dir is parent of src
        - "./src/file.conf:/path/in/container/file.conf 

使用docker run命令绑定挂载文件会产生:

docker: Error response from daemon: invalid mount config for type "bind": invalid mount path: 'path/file.conf' mount path must be absolute. 
See 'docker run --help'.

显然,这样做的唯一方法是指定一个绝对挂载路径,就像这样:

docker run -it --rm --mount type=bind,source="/path/to/file.conf",target=/file.conf alpine sh

对于Windows用户使用“%cd%”,对于Linux用户使用“$(pwd)”也是一种处理绝对路径的方法。

参见存储绑定挂载

对于Visual Studio Code用户,请确保您在命令提示符终端中运行%cd%命令,而不是PowerShell。

对我来说,问题是我指定了不正确的源文件。

这里有一个例子:

 robert ❱ ~ ❱ docker run --rm -it -v "${PWD}/non-existant:/root/destination" -w /root --entrypoint /usr/bin/ls ubuntu -lad destination
drwxr-xr-x 2 root root 64 Mar 29 05:54 destination
 robert ❱ ~ ❱ touch exists
 robert ❱ ~ ❱ docker run --rm -it -v "${PWD}/exists:/root/destination" -w /root --entrypoint /usr/bin/ls ubuntu -lad destination
-rw-r--r-- 1 root root 0 Mar 29 05:58 destination
 robert ❱ ~ ❱

TL;DR -这可能是你的拼写,就像我的拼写一样。

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

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