Windows卷上的docker-compose无法正常工作

时间:2018-06-21 02:25:08

标签: docker-compose yaml docker-volume

过去一周来我一直在与Docker一起玩,认为容器的想法非常有用,但是尽管过去三天我都读懂了,但我无法使卷映射正常工作

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映像,我需要保留其中的数据,但是我想知道魔术是什么,因为我尝试过的任何方法都无法正常工作。非常感谢您的帮助。

我正在Windows 10 Pro内部版本1803上运行。

为什么必须这么难? 比起您,任何人都知道如何真正做到这一点。

7 个答案:

答案 0 :(得分:3)

解决方案是使用 volumes :选项在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。

答案 1 :(得分:1)

您确定您确实需要映射到某个主机目录吗?如果没有,我的解决方案是预先创建一个卷,并在docker-compose.yaml中使用它。我对Windows和Linux使用相同的脚本。那就是码头工人的美。 这是我启动postgres和mysql的工作:

create_db.sh(您可以在git bash或Windows的类似环境中运行它)

    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information);
    }

    protected override void OnStop()
    {
        EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information);
    }

    protected override void OnShutdown()
    {
        EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information);
    }

docker-compose.yaml:

docker volume create --name postgres-data -d local
docker volume create --name mysql-data -d local
docker-compose up -d

答案 2 :(得分:0)

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

就我而言,密码是由公司安全策略更改的。

答案 3 :(得分:0)

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

通过Docker in tray - right click - Settings启用此类共享对我有所帮助,卷开始正常运行。 enter image description here

答案 4 :(得分:0)

Windows上的Docker具有奇怪的行为,因为Windows在凭据以及使用的虚拟机(Hyper-V,VirtualBox-取决于您的Docker版本和设置)方面都有局限性。

基本上,在

中映射文件夹是正确的
  

音量:

您服务中的部分:

路径是

version: '3.4'
services:
  db:
    image: dbimage:latest
    container_name: azure-db
    volumes:
         - c:/Temp/sqldata:/mssql

重要的是您不需要在卷部分中显式创建卷,但是docker-compose up会创建它(与docker run相同)。

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

  

docker volume ls

但是它将与Windows目录中和容器路径/ mssql中的相同文件一起使用

您可以使用以下方法进行测试:

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

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

如果它消失了,可能是丢失了凭据,并通过Docker-> Settings-> Shared Drives-> Reset凭据重置了它。

我希望它很清楚,并为您涵盖了所有方面。

答案 5 :(得分:0)

对于使用Ubunto WSL的用户:

  • sudo mkdir /c
  • sudo mount --bind /mnt/c /c
  • 使用新路径(/ c / your-project-path而不是/ mnt / c / your-project-path)导航到项目文件
  • 编辑docker-compose.yml并使用相对路径作为音量:(例如./src而不是c / your-project-path / src)
  • docker-compose up

答案 6 :(得分:0)

  1. 从Windows任务栏中启动Docker
  2. 单击顶部的“设置”图标
  3. 点击资源
  4. 点击文件共享
  5. 单击(+)符号并添加要在其中映射容器体积的本地文件夹的路径。

对我有用。