问题描述
在一个使用Windows和Linux的应用程序中,开发人员正在使用Docker容器构建应用程序,并为构建环境提供了一个docker-compose规范。本地目录作为卷进行挂载:
volumes:
- ${PWD}:/tmp
然而,在Windows上这样的写法无法工作,因为$PWD
未定义。
我的问题是:
我们能否有一个单一的docker-compose.yml
文件,以满足Windows和Linux开发人员的需求? 显然,对我来说,这样做的一种方式是为每个操作系统分别创建两个docker-compose文件。
解决方案
请注意以下操作可能存在版本差异,建议在操作前进行备份。
方案1
在Docker Compose中,可以通过使用./
来表示当前Docker Compose文件所在的目录。因此,你可以将”工作目录”设置为”./”,如果你想设置一个位于此之下的目录,可以这样写:
volumes:
- ./DirectoryIWantToTarget:/tmp
这个方法在Docker Compose的文档中有一个示例,你可以在这里找到。这种方法也使解决方案具有跨平台的特性。
方案2
如果你需要确保在Windows和Linux之间完全一致,有几种解决方法。例如,Windows开发人员可以使用Git Bash、WSL等工具来模拟Linux环境。
另一种方法是使用长语法定义卷,如官方文档中的示例所示:
version: '3.7'
services:
web:
build: ./DirectoryWithDockerfile
volumes:
- type: bind
source: ./DirectoryIWantToMountInDockerContainer
target: /path/where/mount/source
volume:
nocopy: true
ports:
- 8000:8000
请注意,这里使用了长语法的卷定义,它提供了更多的灵活性。
无论哪种方法,都能够满足你的需求,让你的Docker Compose文件在Windows和Linux上都有效。
方案3
如果你在使用Hyper-V模式的Docker(Windows上的Docker),并希望有一个持久化的数据库,可以按照以下步骤进行操作:
- 在任何位置创建一个文件夹,用于存放数据库数据,例如:D:\DockerDB。
- 在Docker设置中选择Hyper-V模式。
- 在资源管理器中打开Docker设置,进入“资源”选项卡,然后选择“文件共享”并将数据库数据文件夹(D:\DockerDB)添加到共享列表中。
- 在你的
docker-compose.yml
文件中,按以下方式设置卷:
version: '3.7'
services:
mysqldb:
container_name: mysqldb
image: mysql
volumes:
- D:/DockerDB:/var/lib/mysql
这样,数据库数据将持久保存在本地机器上。
通过以上这些方法,你可以在Windows和Linux上都有效地使用Docker Compose卷,从而满足不同操作系统的开发人员的需求。