如何在卷中安装单个文件

对于docker工人来说,我是相当新的,有些卷的概念对我来说是相当混乱的。

我想要做的是dockerize一个PHP应用程序。 在dockerfile中我下载了档案,解压缩等等。

一切工作正常,但是如果一个新版本获得释放,我更新dockerfile我不得不重新安装应用程序,因为config.php被覆盖。

所以我想我可以挂载文件作为一个卷,就像我对数据库做的一样。

我尝试了两种方式,一个音量和一个直接的path。

泊坞窗 – 撰写:

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: 

这会导致错误:

我试着用一个给定的path,作为一个挂载的音量。

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

然而这两种方式都不起作用。 随着装入卷我看到上传被创build。

但随后失败

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

如果我用/src/docker/myapp/upload/config.php:/var/www/html/config.php

Docker创build上传文件夹,然后创build一个config.php文件夹。 不是一个文件。

还是有另一种方法来persitconfiguration?

在docker(绝对path示例(可以使用envvariables),并且需要提及文件名)中以这种方式完成文件卷的操作:

  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

我曾经遭受类似的问题。 我试图导入我的configuration文件到我的容器,以便我可以修复它,而不需要重新构build图像。

我的意思是我以为下面的命令会将容器中的/root/app/config.py导入到Docker主机上的$(pwd)/config.py文件中。

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

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

一边寻找线索,我发现原因(从这里 )

如果使用-v或-volume绑定挂载Docker主机上尚不存在的文件或目录,则-v将为您创build端点。 它始终是作为一个目录创build的。

正如你所看到的,它总是被创build为一个目录,因为我的docker主机没有$(pwd)/config.py

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