【问题标题】:Cannot map a host directory with spaces to a container directory (bind mounts) - Docker Quickstart Terminal (Bash), windows 10无法将带有空格的主机目录映射到容器目录(绑定挂载) - Docker 快速入门终端(Bash),Windows 10
【发布时间】:2022-02-03 21:20:27
【问题描述】:

我是 Docker 的新手。我正在学习使用绑定挂载和卷的教程,我使用的是 Windows 10 Docker 快速入门终端 (bash) 和 Docker 19.03.1。

我在目录.../dockerfile-sample-2注意:此路径包含空格)包含:

$ ls -al
total 18
drwxr-xr-x 1 Tommaso 197121   0 mag 10 11:55 ./
drwxr-xr-x 1 Tommaso 197121   0 mag  1 19:20 ../
-rw-r--r-- 1 Tommaso 197121 410 apr 11 09:06 Dockerfile
-rw-r--r-- 1 Tommaso 197121 249 apr 11 09:06 index.html
-rw-r--r-- 1 Tommaso 197121   0 mag 10 11:55 testme.txt

现在我运行并得到以下信息:

.../dockerfile-sample-2
$ docker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx
b8f24ee0e0b76d0b06503ce90fbd6a9e2110e40eaa4432e8c77556510c61a989

.../dockerfile-sample-2
$ docker container run -d --name nginx2 -p 8080:80 nginx
3450433e18097291936d7e62071769521eb36e92f509ad931c9e927f135df71a

现在,根据教程,通过访问 IP 地址 http://192.168.99.101/http://192.168.99.101:8080,我应该能够分别看到 index.html 文件中的自定义登录页面和原来的 nginx 登陆页面。

但是,我只获得了两次原始的 nginx 登陆页面。

还有更多,根据我的教程,通过运行

docker container exec -it nginx bash
cd /usr/share/nginx/html
ls –al

我应该得到与上一个目录.../dockerfile-sample-2相同的内容。

但是,我只得到

root@b8f24ee0e0b7:/usr/share/nginx/html# ls -al
total 16
drwxr-xr-x 2 root root 4096 Apr 13 19:20 .
drwxr-xr-x 3 root root 4096 Apr 13 19:20 ..
-rw-r--r-- 1 root root  494 Apr 13 15:13 50x.html
-rw-r--r-- 1 root root  612 Apr 13 15:13 index.html

再一次,根据我的教程,如果我要在我的 .../dockerfile-sample-2 目录中创建一个新文件,它应该出现在结果中

docker container exec -it nginx bash
cd /usr/share/nginx/html
ls –al

但事实并非如此。

我做错了什么?


这里有一些上下文:

我的正在运行的容器

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
3450433e1809        nginx               "/docker-entrypoint.…"   20 minutes ago      Up 20 minutes       0.0.0.0:8080->80/tcp   nginx2
b8f24ee0e0b7        nginx               "/docker-entrypoint.…"   21 minutes ago      Up 21 minutes       0.0.0.0:80->80/tcp     nginx

在我的 Dockerfile 中:

# this shows how we can extend/change an existing official image from Docker Hub
FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn

WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is preferred to using 'RUN cd /some/path'

COPY index.html index.html

# I don't have to specify EXPOSE or CMD because they're in my FROM

在我的Index.html中:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">

  <title>Your 2nd Dockerfile worked!</title>

</head>

<body>
  <h1>You just successfully ran a container with a custom file copied into the image at build time!</h1>
</body>
</html>

更新:

我敢打赌,问题与当前工作目录包含空格有关。

所以我删除了 nginx 容器并尝试运行其他容器。

以下命令:

docker container run -d --name nginx -p 80:80 -v "$(pwd)":/usr/share/nginx/html nginx

docker container run -d --name nginx -p 80:80 -v "/d/Files Tommaso/Programmazione/Docker/udemy-docker-mastery-main/dockerfile-sample-2:/usr/share/nginx/html" nginx

docker container run -d --name nginx -p 80:80 -v "/d/Files Tommaso/Programmazione/Docker/udemy-docker-mastery-main/dockerfile-sample-2":/usr/share/nginx/html nginx

当我尝试访问http://192.168.99.101/ 时,让我的浏览器获得403 Forbidden


而这些其他命令:

docker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx

docker container run -d --name nginx -p 80:80 -v /$(pwd):/usr/share/nginx/html nginx

docker container run -d --name nginx -p 80:80 -v `pwd -W`:/usr/share/nginx/html nginx

docker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx

docker container run -d --name nginx -p 80:80 -v /d/Files Tommaso/Programmazione/Docker/udemy-docker-mastery-main/dockerfile-sample-2:/usr/share/nginx/html nginx

让我的终端响应:

C:\Applicazioni_Tommaso\Docker Toolbox\docker.exe: invalid reference format: repository name must be lowercase.
See 'C:\Applicazioni_Tommaso\Docker Toolbox\docker.exe run --help'.

我打赌这意味着它无法解析空格。


还有这些其他命令:

docker container run -d --name nginx -p 80:80 -v %cd%:/usr/share/nginx/html nginx

让我的终端响应:

C:\Applicazioni_Tommaso\Docker Toolbox\docker.exe: Error response from daemon: create YYYY: "YYYY" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.

【问题讨论】:

  • 您的第一个命令绑定挂载到/us/share/...,在/usr/ 中没有r;这是问题中的错字吗?
  • 是的,错字就在问题中。我卸下了容器并再次进行了整个巡回演出,但遇到了同样的问题。我更新了问题。谢谢

标签: windows docker spaces mounted-volumes docker-quickstart-terminal


【解决方案1】:

经过几次尝试,我可以假设

  • 在 Windows 10 上
  • 使用 Docker 快速入门终端

Docker 19.03.1 无法管理 &lt;path containing spaces&gt;-v 参数中的使用

docker container run -d --name <name> -p 80:80 -v <path containing spaces>:<destination path> <image>

我发现解决此问题的唯一方法是将源卷目录更改为没有文件夹包含空格的目录,然后运行

docker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx

【讨论】:

    【解决方案2】:

    在使用-v 绑定directory:volume 时,我遇到了几乎相同的问题(假设目录中的间距会导致问题)。

    上下文:
    使用 lambci/lambda:build-python3.8 映像运行 aws lambda 函数部署包构建任务容器,利用 windowspath\build 中的文件。

    以下命令对我有用,因为windowspath\build 中的文件被识别并用于以下/bin/sh -c 命令;因此绑定到/var/task 可以正常工作。

    注意:-v 标志之后,双引号仅用于源目录(windows style pathing,据说也适用于unix 样式),在冒号之前结束双引号,目录/var/task冒号后指的是 docker 运行环境目录(unix 风格/WSL 后端)。

    docker run -v "C:\windowspath\build":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t package/;cd package;zip -r ../deployment_package.zip .;zip -g ../deployment_package.zip ../lambda_function.py"
    

    【讨论】:

    • 欢呼@Tms91 格式化我的答案以提高可读性!
    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 2020-05-27
    • 2020-09-20
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2019-07-08
    • 2016-06-10
    相关资源
    最近更新 更多