docker-compose在Windows上无法正常工作

问题描述 投票:2回答:6

过去一周我一直在玩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映像,我需要保存数据,但我想知道什么是魔法,因为我尝试过的任何东西都没有。任何帮助是极大的赞赏。

我在Windows 10 Pro build 1803上运行。

为什么要这么难?比任何人都知道如何让它真正起作用。

docker-compose yaml docker-volume
6个回答
4
投票

解决方案是使用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。


2
投票

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

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

希望能帮助到你


1
投票

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

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


0
投票

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

通过以下方式启用此类共享:Docker in tray - right click - Settings,帮助了我,卷开始正常工作。 enter image description here


0
投票

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

重要的是,您不需要在卷部分中显式创建卷,但是docker-compose up将创建它(对于docker run也是如此)。

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

码头工人量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 credentials重置它。

我希望它清楚并涵盖了所有方面。


0
投票

对于那些使用Ubuntu 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
© www.soinside.com 2019 - 2024. All rights reserved.