在Windows和Linux上都有效的Docker Compose卷语法

96次阅读
没有评论

问题描述

在一个使用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),并希望有一个持久化的数据库,可以按照以下步骤进行操作:

  1. 在任何位置创建一个文件夹,用于存放数据库数据,例如:D:\DockerDB。
  2. 在Docker设置中选择Hyper-V模式。
  3. 在资源管理器中打开Docker设置,进入“资源”选项卡,然后选择“文件共享”并将数据库数据文件夹(D:\DockerDB)添加到共享列表中。
  4. 在你的docker-compose.yml文件中,按以下方式设置卷:
version: '3.7'
services:
  mysqldb:
    container_name: mysqldb
    image: mysql
    volumes:
      - D:/DockerDB:/var/lib/mysql

这样,数据库数据将持久保存在本地机器上。

通过以上这些方法,你可以在Windows和Linux上都有效地使用Docker Compose卷,从而满足不同操作系统的开发人员的需求。

正文完