Docker compose Windows卷上的docker compose不工作

Docker compose Windows卷上的docker compose不工作,docker-compose,yaml,docker-volume,Docker Compose,Yaml,Docker Volume,在过去的一周里,我一直在和Docker一起玩,我认为容器的想法非常有用,但是尽管在过去的3天里我阅读了所有我能阅读的东西,我还是无法让体积映射工作 get docker-compose to use my existing volume. Docker Version: 18.03.1-ce docker-compose version 1.21.1, build 7641a569 I created a volume using the following via a Do

在过去的一周里,我一直在和Docker一起玩,我认为容器的想法非常有用,但是尽管在过去的3天里我阅读了所有我能阅读的东西,我还是无法让体积映射工作

get docker-compose to use my existing volume.

    Docker Version: 18.03.1-ce
    docker-compose version 1.21.1, build 7641a569

I created a volume using the following via a Dockerfile

    # Reference SQL image
    FROM microsoft/mssql-server-windows-developer

    # Create directory within SQL container for database files mapped to the    volume
    VOLUME sqldata:c:/MSSQL

and here it shows:
    C:\ProgramData\Docker\volumes>docker volume ls
    local               sqldata

Now I've tried probably 60+ different "solutions" based on StackOverflow and Docker forums, but none of them work. (Note despite the names below with Azure I am simply trying to get this to run locally, Azure is next hurdle)

    Docker-compose.yaml:

    version: '3.4'
    services:
      ws:
        image: wsManager
        container_name: azure-wcf
        ports:
           - "80"
        depends_on:
            - db

      db:
        image: dbimage:latest
        container_name: azure-db
        volumes:
             - \sqldata:/mssql
#            - type: volume
#              source: sqldata
#              target: /mssql
        ports:
            - "1433"

I've added a volumes section but it does not help, 

    volumes:
        sqldata:
            external:
                name: sqldata

    changed the - \sqldata:/mssql
    to every possible slash .. . ~ whatever.  Moved the file to yaml file 
到C:\ProgramData\Docker\volumes-基本上是搜索结果中显示的任何建议。dbImage是一个SQL Server映像,我需要从中持久化数据,但我想知道它的神奇之处是什么,因为我尝试过的任何东西都不起作用。非常感谢您的帮助

我运行的是Windows10Pro版本1803

为什么这么难?
而不是你告诉任何知道如何让它真正起作用的人

解决方案是使用卷:选项在Windows上引用真实路径,如下所示:

sqldb:
    image: sqlimage 
    container_name: azure-db
    volumes:
      - "C:\\ProgramData\\Docker\\volumes\\sqldata:c:\\mssql"
为了保存数据,我使用了以下方法:

environment:
   - "sa_password=ddsql2017@@"
   - "ACCEPT_EULA=Y"
   - 'attach_dbs= {"dbName":"MyDb","dbFiles":"C:\\MSSQL\\MyDb.mdf","C:\\MSSQL\\MyDb.ldf"]}]'

希望这对其他人有所帮助,因为我在SO和其他地方找到的许多例子对我都不起作用,在Docker论坛上有很多帖子说,安装卷不适用于Windows。

我在尝试将卷安装到Windows机器的特定路径时遇到了类似的问题:基本上它不起作用,所以每次重新启动Docker实例时,我都会丢失所有的DB数据。 我最终发现,这是因为默认情况下Docker for Windows无法解释Windows路径,因此必须激活COMPOSE\u CONVERT\u Windows\u path标志。为此:

  • 运行命令“set COMPOSE\u CONVERT\u WINDOWS\u path=1”
  • 重新启动Docker
  • 转到设置>共享驱动器>重置凭据,然后选择驱动器,然后应用
  • 从命令行中,杀死容器(docker容器rm-f)
  • 重新运行容器

希望对您有所帮助

如果您的windows帐户凭据已更改,您还必须重置共享驱动器的凭据。(设置>共享驱动器>重置凭据)


在我的情况下,密码是由我的公司安全策略更改的

默认情况下,在Windows上安装Docker后,驱动程序共享被禁用-因此您将无法使用卷(存储在磁盘上)

通过:
Docker in tray-右键单击-Settings
(设置)启用此类共享对我有帮助,卷开始正常工作。
Windows上的Docker出现了奇怪的行为,因为Windows对凭据和Docker使用的虚拟机(Hyper-V、VirtualBox-取决于Docker版本和设置)都有限制

基本上,在中映射文件夹是正确的

卷数:

在您的服务中:

路径是

version: '3.4'
services:
  db:
    image: dbimage:latest
    container_name: azure-db
    volumes:
         - c:/Temp/sqldata:/mssql
重要的是,您不需要在volumes部分显式创建卷,但docker compose up将创建它(docker run也是如此)

奇怪的是,它永远不会出现在

docker卷

但它可以用于windows目录和容器路径/mssql中的相同文件

您可以使用以下工具进行测试:

docker run --rm -v c:/Temp/sqldata:/data alpine ls /data

如果它消失,可能会丢失凭据,并通过Docker->Settings->Shared Drive->Reset credentials将其重置


我希望它是清晰的,为您涵盖了所有方面。

对于使用UBTO WSL的用户:

  • sudo mkdir/c
  • sudo挂载——绑定/mnt/c/c
  • 使用新路径导航到项目文件(/c/您的项目路径而不是/mnt/c/您的项目路径)
  • 编辑docker-compose.yml并使用卷的相对路径:(如./src而不是c/your project path/src)
  • docker编写

您确定确实需要映射到某个主机目录吗?如果没有,我的解决方案是预先创建一个卷,并在docker-compose.yaml中使用它。我对windows和linux使用相同的脚本。这就是docker的魅力所在。 以下是我为启动postgres和mysql所做的工作:

创建_db.sh(您可以在git bash或windows中的类似环境中运行它):

docker-compose.yaml:

version: '3'

services:
  postgres:
    image: postgres:latest
    environment:
      POSTGRES_DB: datasource
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
    volumes:
      - postgres-data:/var/lib/postgresql/data

  mysql:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: 'train'
      MYSQL_USER: 'mysql'
      MYSQL_PASSWORD: 'mysql'
      MYSQL_ROOT_PASSWORD: 'mysql'
    ports:
      - 3306:3306
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
    postgres-data:
      external: true
    mysql-data:
      external: true
  • 从windows任务栏启动Docker
  • 点击顶部的设置图标
  • 单击资源
  • 单击文件共享
  • 单击(+)符号并添加要映射容器卷的本地文件夹的路径

  • 这对我来说很有效。

    我终于找到了答案,以下内容对我很有帮助:()以及微软网站上的一些文档。我将yaml文件的适用部分更改如下:sqldb:image:dbimage:latest container\u name:azure db volumes:-“C:\\ProgramData\\Docker\\volumes\\sqldata:C:\\mssql”是的,它也适用于我!这是docker的官方问题/解决方案你是个英雄,伙计。没有其他帮助,我一直在钻研数十个不同的SO和github问题,这最终对我有效。此外,如果命令“set COMPOSE\u CONVERT\u WINDOWS\u path=1”不存在,您可以将COMPOSE\u CONVERT\u path=1放入.env文件中。在那之后,docker-compose.yml文件${PWD}内部也应该工作!
    docker volume create --name postgres-data -d local
    docker volume create --name mysql-data -d local
    docker-compose up -d
    
    version: '3'
    
    services:
      postgres:
        image: postgres:latest
        environment:
          POSTGRES_DB: datasource
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432
        volumes:
          - postgres-data:/var/lib/postgresql/data
    
      mysql:
        image: mysql:latest
        environment:
          MYSQL_DATABASE: 'train'
          MYSQL_USER: 'mysql'
          MYSQL_PASSWORD: 'mysql'
          MYSQL_ROOT_PASSWORD: 'mysql'
        ports:
          - 3306:3306
        volumes:
          - mysql-data:/var/lib/mysql
    
    volumes:
        postgres-data:
          external: true
        mysql-data:
          external: true