过去一周来我一直在与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上运行。
为什么必须这么难? 比起您,任何人都知道如何真正做到这一点。
答案 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
启用此类共享对我有所帮助,卷开始正常运行。
答案 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
docker-compose up
答案 6 :(得分:0)
对我有用。