簡體   English   中英

如何在使用 Windows 主機時掛載 Docker 卷?

[英]How do I mount a Docker volume while using a Windows host?

在 Windows 主機下安裝 Docker 卷對我來說是一個巨大的痛苦,我無法讓它工作。

目前我得到了以下簡單的 Dockerfile:

FROM php:5-apache
RUN apt-get update

當我從中構建圖像並啟動容器時

docker build -t phisch:dev .
docker run phisch:dev

容器正常啟動。

但是當我試圖掛載一個卷時,

docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

將顯示以下消息:

C:\Users\phisch\dev>docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
no such file or directory
docker: Error response from daemon: Container command not found or does not exist..

/var/www目錄肯定存在於容器中,嘗試其他目錄並不會改變結果。 在主機端目錄前添加一個斜杠也無濟於事。 ( //c/Users/phisch/dev/htdocs )

例如,如何將/var/www掛載到C:/Users/phisch/dev/htdocs

phisch@DESKTOP-UC1LB9J MINGW64 ~/dev (master)
$ docker inspect phisch:dev
[
    {
        "Id": "sha256:73c1533222a905a378f12505ccbd9e9b34cde5a4b34ed008c39e23d5d58a9c91",
        "RepoTags": [
            "dev_web:latest",
            "phisch:dev",
            "phisch:dev3"
        ],
        "RepoDigests": [],
        "Parent": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
        "Comment": "",
        "Created": "2016-02-10T12:16:37.667236134Z",
        "Container": "dad811f51ef3b94d9845d13a0e43ad07ccd5684ea2747b3846accdc71abeb628",
        "ContainerConfig": {
            "Hostname": "e06f5a03fe1f",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "PHP_INI_DIR=/usr/local/etc/php",
                "PHP_EXTRA_BUILD_DEPS=apache2-dev",
                "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2",
                "GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3",
                "PHP_VERSION=5.6.18",
                "PHP_FILENAME=php-5.6.18.tar.xz",
                "PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "apt-get update"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
            "Volumes": null,
            "WorkingDir": "/var/www/html",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {}
        },
        "DockerVersion": "1.10.0",
        "Author": "",
        "Config": {
            "Hostname": "e06f5a03fe1f",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "PHP_INI_DIR=/usr/local/etc/php",
                "PHP_EXTRA_BUILD_DEPS=apache2-dev",
                "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2",
                "GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3",
                "PHP_VERSION=5.6.18",
                "PHP_FILENAME=php-5.6.18.tar.xz",
                "PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0"
            ],
            "Cmd": [
                "apache2-foreground"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
            "Volumes": null,
            "WorkingDir": "/var/www/html",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 491287784,
        "VirtualSize": 491287784,
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        }
    }
]

事實證明容器端目錄/var/www需要為空,因為它有一個子目錄www Docker 無法將其用作安裝點。

/有可能被 CMD Windows shell 解釋為一個選項。

首先嘗試使用 docker-machine ssh 默認值,以便在您的 VM 中打開 ssh 會話。 那里再次嘗試docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

正如thaJeztahissue 18290 中評論的那樣:

您可以考慮使用docker-compose docker-compose 允許您相對於docker-compose.yml文件的位置定義綁定安裝的卷。
使用docker-compose文件允許您在單個文件中指定運行容器所需的所有選項,這使其成為團隊成員之間共享的理想選擇(即,只需運行docker-compose up -d將啟動項目的所有容器正確的選擇)。

這條評論提到了一個&添加第二個/:

docker run -v //c/Users/phisch/dev/htdocs:`/var/www` phisch:dev

即使在 docker 工具箱 msys shell 會話中,也存在問題(如issue 282

Pyetro評論中指出:

在 Windows 中,路徑的開頭需要一個雙斜杠來指示工作目錄。
只是為了像這樣使用短路徑:

 docker run -v //$(PWD)/folder:/folder ...

經過長時間的討論,問題是/var/www里面有一個文件夾。

/c/Users/phisch/dev/htdoc到一個空文件夾確實有效,但可能不會給出預期的結果,因為默認 CMD apache2-foreground可能仍基於/var/www提供其內容(不會有htdocs內容,如果該htdocs安裝到另一個文件夾)。

我將 Docker for Windows 與 PowerShell 一起使用,並在掛載卷時使用$PWD來引用當前目錄,這對我來說效果很好。 幾個例子:

docker run -p 2368:2368 -v $PWD/ghost:/var/lib/ghost -d ghost

docker run -p 2368:2368 -v $PWD/:/var/lib/ghost -d ghost

如果我們談論的是 Windows 上的 Docker,那么我們必須考慮到所有容器都在 VirtualBox 上運行的事實。

在將卷安裝到容器之前,我們必須確保特定文件夾可用於 VirtualBox。

首先,要定義當前運行的 Docker 機器的名稱,運行

$ docker-machine.exe  active
default

其次,將共享文件夾添加到 VirtualBox:

$ VBoxManage sharedfolder add default --name "some_project" --hostpath D:\Projects\some_project

三、創建文件夾

$ docker-machine.exe ssh default 'sudo mkdir --parents /d/projects/some_project'

四、掛載:

$ docker-machine.exe ssh default 'sudo mount -t vboxsf some_project /d/projects/some_project'

最后,創建一個容器:

$ docker run -v //d/projects/some_project://d/projects/some_project -d some-image_name

首先,確保您以管理員身份從powershell運行。

接下來,運行如下命令:

docker run --name=ken -p 8080:80 -v //c/users/Ken/Desktop/docker:/usr/share/nginx/html:ro -d nginx

測試在 Windows 11 上工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM