无法在 docker 中绑定主机卷 - compose for Docker Windows
Unable to bind host volume in docker-compose for Docker Windows
我一直在尝试解决这个问题,这似乎是永恒的,但似乎 Docker for Windows 最近才能够成功绑定来自 Windows 承载其 Docker 容器。但是,我无法通过 docker-compose
获得相同的功能。有没有人对此有任何明确的信息,或者我如何才能让它发挥作用的想法?
我已经阅读了大量关于 Windows 卷安装的 GitHub 问题,但似乎大多数答案都与获取 Docker 有关 挂载卷。我没有遇到任何问题,只是 docker-compose
.
为了说明我的问题,以下命令给出了以下输出,这是我本地目录的正确内容,挂载在 Docker:
$ docker run --rm -v c:/Users/synta/go/src/github.com/syntaqx/example:/go/src/github.com/syntaqx/example alpine ls /go/src/github.com/syntaqx/example
LICENSE
README.md
cmd
docker-compose.yml
docs
go.mod
go.sum
example.go
但是,在 docker-compose.yml
:
中给出相同的实现
version: '3.6'
services:
example:
build:
context: .
dockerfile: Dockerfile
volumes:
- /c/Users/syntaqx/go/src/github.com/syntaqx/example:/go/src/github.com/syntaqx/example
以及以下 Dockerfile
:
ARG GO_VERSION=1.11
ARG ALPINE_VERSION=3.8
FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS builder
WORKDIR /go/src/github.com/syntaqx/example
RUN ls -alh
ENTRYPOINT ["go"]
我实际上没有输出(ls -alh
给出 .
和 ..
,让我知道目录肯定是通过 WORKDIR
存在的,但不是从绑定):
$ docker-compose up -d --build
Building example
Step 1/6 : ARG GO_VERSION=1.11
Step 2/6 : ARG ALPINE_VERSION=3.8
Step 3/6 : FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS builder
---> be1230a1b343
Step 4/6 : WORKDIR /go/src/github.com/syntaqx/example
---> Using cache
---> a0ccb401a86a
Step 5/6 : RUN ls /go/src/github.com/syntaqx/example
---> Running in 0cd52d44a637
Removing intermediate container 0cd52d44a637
---> 4f362f738e49
Step 6/6 : ENTRYPOINT ["go"]
---> Running in 5d7a1e841bfe
Removing intermediate container 5d7a1e841bfe
---> 9da9cfcf372a
...
也许我在这里遗漏了一些明显的东西,但我已经尝试了十几种表达音量路径的方法(.
、C:\
、/c/
、///c
), 相对路径在 Docker Windows 中明显被破坏,而其他路径没有改变结果。
如果这是重复的,也非常抱歉,但据我所见,大多数其他问题都非常具体地尝试在 Docker 期间安装主机卷。或者,相对路径的问题,我很乐意暂时避开。重复一遍,如我的示例所示,所有这些对我来说都很好,只是 docker-compose
似乎损坏了。
希望你们中的一个能帮助我!在这里感觉非常超出我的深度。
版本
那是一条多么漫长的路啊。
但是,我学到了一些东西:我实际上对卷挂载在 Docker 中的工作方式存在根本性的误解。令我惊讶的是,包括相对卷路径在内的所有内容都按预期工作。
我对卷挂载的根本误解是它们在构建步骤中不可用,但挂载附加到最终容器。 Docker 强加了这个要求,因为没有它,构建将不可重复。
因此,在我上面提供的用例中,Dockerfile
和 docker run
命令之间的唯一区别(尽管在我理解之前并不明显)是我的 Dockerfile
正在积极构建容器,并尝试执行命令,其中 docker run
仅 运行 在预构建的 alpine
.
上执行命令
那么,是否可以做我正在做的事情? 有点
我 运行 加入了几个使用装饰器式 entrypoint.sh
链接模式的奶酪解决方案,允许您将多个 Dockerfile
构建输出链接到它们的最终容器中,并且当它是 运行,在给定的 CMD
之前执行链式命令。简而言之,您有一堆以 ENTRYPOINT ["entrypoint.sh"]
结尾的 dockerfile,然后概述您之前将利用 RUN
的步骤:
- ls.dockerfile
- mod.dockerfile
- final.dockerfile
#!/bin/sh
set -eu
until /go/src/github.com/syntaqx/example && go mod download
do
echo "Waiting for mount..."
done
sh -c "go $*"
然后,您可以让每个 dockerfile 将命令推送到最后一个命令之上。
Note: I did not end up using this once, as I describe below, so this shell may not work, but I thought it was a cool implementation thought, so I wanted to nod to it.
然而,对于我的用例,所有这些都是非常不必要的。知道命令失败的原因后,我可以简单地将 RUN
命令推迟到最后的 ENTRYPOINT
,创建一个单数 entrypoint.sh
,然后 运行 它们按照我在构建过程中想要的顺序。我不会以这种方式从依赖项缓存中受益,但对于这个特定用例我也不需要它。
感谢阅读,希望你也有所收获!
我一直在尝试解决这个问题,这似乎是永恒的,但似乎 Docker for Windows 最近才能够成功绑定来自 Windows 承载其 Docker 容器。但是,我无法通过 docker-compose
获得相同的功能。有没有人对此有任何明确的信息,或者我如何才能让它发挥作用的想法?
我已经阅读了大量关于 Windows 卷安装的 GitHub 问题,但似乎大多数答案都与获取 Docker 有关 挂载卷。我没有遇到任何问题,只是 docker-compose
.
为了说明我的问题,以下命令给出了以下输出,这是我本地目录的正确内容,挂载在 Docker:
$ docker run --rm -v c:/Users/synta/go/src/github.com/syntaqx/example:/go/src/github.com/syntaqx/example alpine ls /go/src/github.com/syntaqx/example
LICENSE
README.md
cmd
docker-compose.yml
docs
go.mod
go.sum
example.go
但是,在 docker-compose.yml
:
version: '3.6'
services:
example:
build:
context: .
dockerfile: Dockerfile
volumes:
- /c/Users/syntaqx/go/src/github.com/syntaqx/example:/go/src/github.com/syntaqx/example
以及以下 Dockerfile
:
ARG GO_VERSION=1.11
ARG ALPINE_VERSION=3.8
FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS builder
WORKDIR /go/src/github.com/syntaqx/example
RUN ls -alh
ENTRYPOINT ["go"]
我实际上没有输出(ls -alh
给出 .
和 ..
,让我知道目录肯定是通过 WORKDIR
存在的,但不是从绑定):
$ docker-compose up -d --build
Building example
Step 1/6 : ARG GO_VERSION=1.11
Step 2/6 : ARG ALPINE_VERSION=3.8
Step 3/6 : FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS builder
---> be1230a1b343
Step 4/6 : WORKDIR /go/src/github.com/syntaqx/example
---> Using cache
---> a0ccb401a86a
Step 5/6 : RUN ls /go/src/github.com/syntaqx/example
---> Running in 0cd52d44a637
Removing intermediate container 0cd52d44a637
---> 4f362f738e49
Step 6/6 : ENTRYPOINT ["go"]
---> Running in 5d7a1e841bfe
Removing intermediate container 5d7a1e841bfe
---> 9da9cfcf372a
...
也许我在这里遗漏了一些明显的东西,但我已经尝试了十几种表达音量路径的方法(.
、C:\
、/c/
、///c
), 相对路径在 Docker Windows 中明显被破坏,而其他路径没有改变结果。
如果这是重复的,也非常抱歉,但据我所见,大多数其他问题都非常具体地尝试在 Docker 期间安装主机卷。或者,相对路径的问题,我很乐意暂时避开。重复一遍,如我的示例所示,所有这些对我来说都很好,只是 docker-compose
似乎损坏了。
希望你们中的一个能帮助我!在这里感觉非常超出我的深度。
版本
那是一条多么漫长的路啊。
但是,我学到了一些东西:我实际上对卷挂载在 Docker 中的工作方式存在根本性的误解。令我惊讶的是,包括相对卷路径在内的所有内容都按预期工作。
我对卷挂载的根本误解是它们在构建步骤中不可用,但挂载附加到最终容器。 Docker 强加了这个要求,因为没有它,构建将不可重复。
因此,在我上面提供的用例中,Dockerfile
和 docker run
命令之间的唯一区别(尽管在我理解之前并不明显)是我的 Dockerfile
正在积极构建容器,并尝试执行命令,其中 docker run
仅 运行 在预构建的 alpine
.
那么,是否可以做我正在做的事情? 有点
我 运行 加入了几个使用装饰器式 entrypoint.sh
链接模式的奶酪解决方案,允许您将多个 Dockerfile
构建输出链接到它们的最终容器中,并且当它是 运行,在给定的 CMD
之前执行链式命令。简而言之,您有一堆以 ENTRYPOINT ["entrypoint.sh"]
结尾的 dockerfile,然后概述您之前将利用 RUN
的步骤:
- ls.dockerfile
- mod.dockerfile
- final.dockerfile
#!/bin/sh
set -eu
until /go/src/github.com/syntaqx/example && go mod download
do
echo "Waiting for mount..."
done
sh -c "go $*"
然后,您可以让每个 dockerfile 将命令推送到最后一个命令之上。
Note: I did not end up using this once, as I describe below, so this shell may not work, but I thought it was a cool implementation thought, so I wanted to nod to it.
然而,对于我的用例,所有这些都是非常不必要的。知道命令失败的原因后,我可以简单地将 RUN
命令推迟到最后的 ENTRYPOINT
,创建一个单数 entrypoint.sh
,然后 运行 它们按照我在构建过程中想要的顺序。我不会以这种方式从依赖项缓存中受益,但对于这个特定用例我也不需要它。
感谢阅读,希望你也有所收获!