docker:参考格式无效

ai2*_*016 67 docker

我正在学习本教程:https: //medium.com/towards-data-science/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c

他们使用码头工人.当我尝试运行docker时(在run.sh脚本中):

docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

docker: invalid reference format.
Run Code Online (Sandbox Code Playgroud)

我花了2个小时,我真的不明白什么是错的.任何想法真的很感激.

Lev*_*yan 57

在powershell中你应该使用${pwd}vs$(pwd)

  • 这就是导致我将头撞到墙上的原因(有时我讨厌M $ FT) (3认同)
  • 对于像 @paul 这样有问题的人,请参考这个答案 /sf/answers/4598359741/ (2认同)
  • 为什么这有效?当我在 Powershell 中运行这两个命令时,“$(pwd)”和“${pwd}”似乎输出完全相同的内容。 (2认同)
  • 问题不是“powershell”标记的,因此将“pwd”更改为“${pwd}”_单独_不会有帮助,因为基于“\”的行延续。鉴于问题中未提及,目前尚不清楚您建议反对的“$(pwd)”表达式来自何处。`$(pwd)` 在 PowerShell 中确实有效(尽管 `$pwd` 更好),_只要您在 `"..."`_ 中使用它,通常建议这样做,例如 `"$(pwd) /../src:/src"` (但是 `"$pwd/../src:/src"` 更好)。只是 `$(pwd)` 作为一个_子表达式_,恰好不能作为_unquoted_复合标记的开头 /cc @Josh (2认同)

BMi*_*tch 30

"run"之后的第一个参数(不是标志的标志或参数)被解析为图像名称.当解析失败时,它会告诉您参考格式,即图像名称(但可能是图像ID,固定图像或其他语法)无效.在你的命令中:

 docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
Run Code Online (Sandbox Code Playgroud)

图像名称"supervisely_anpr"有效,因此您需要在命令的前面查看.在这种情况下,错误很可能是pwd输出其中有空格的路径.空格后的所有内容都不再是参数,-v并且docker尝试将其解析为图像名称.修复是在您无法保证它没有空格或其他特殊字符时引用音量参数.

当你这样做时,你会遇到下一个错误,"找不到可执行文件".将图像名称后的所有内容解析为在容器内运行的命令.在您的情况下,它将尝试运行--rm -it bash几乎肯定会失败的命令,因为--rm在您的图像中不存在二进制文件.您需要重新排序参数以解决该问题:

 docker run --rm -it -p 8888:8888 -v "`pwd`/../src:/src" -v "`pwd`/../data:/data" -w /src supervisely_anpr  bash
Run Code Online (Sandbox Code Playgroud)

我在幻灯片中有关于这两个错误和原因的更多详细信息:https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow-lightning.html#29

  • *幻灯片30 * **解决了**我的问题。我在Cygwin中运行了一个.sh文件。我将`#!/ bin / bash`更改为(注意将##和`!`之间的空格更改为`#!/ bin / bash`,然后将行尾序列从`CRLF`更改为`LF`。是我所做的一切,谢谢@BMitch分享幻灯片。 (3认同)

Aka*_*ash 29

copy-pasted在执行命令时遇到了同样的问题。相反,当我输入整个命令时,它起作用了!

祝你好运...

  • 就我而言,问题在于 -- 并将引号转换为 docker 无法识别的一些奇特的 utf-8 字符。 (5认同)
  • 就我而言,它是一个“破折号”而不是普通的连字符。如果您从网页复制并粘贴命令,或者像我的例子一样,从旨在用作 Docker 备忘单的 PDF 文件复制并粘贴命令,则可能会发生这种情况。 (3认同)

Yas*_*thi 12

我在 Linux 上也遇到了同样的问题。这是因为目录名称包含空格。我通过使用"$(pwd)/path/to/go"而不是修复它$(pwd)/path/to/go


小智 10

我有一个类似的问题。我遇到的问题是$(pwd)那里有一个空间正在抛出 docker run。

将目录名称更改为没有空格,如果这是问题,它应该可以工作


Sea*_*ean 8

对于其他人,请来这里:
如果您碰巧将 docker 命令放入文件中,例如run.sh,请检查您的行分隔符。在Linux中,应该是LR,否则你会得到同样的错误。


小智 8

就我而言,命令是这样的

 docker run -d --name kong-database \
  --network=kong-net \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kongpass" \
  postgres:9.6
Run Code Online (Sandbox Code Playgroud)

我试图将所有内容复制到一行中,包括斜杠 (\),但出现以下错误

docker: invalid reference format.
Run Code Online (Sandbox Code Playgroud)

命令中的斜杠 (\) 表示下一行,因此如果您尝试在一行中运行完整的命令,只需删除斜杠 (\),它对我有用

谢谢 :)


小智 7

有时问题是行尾的额外空格。

坏的:

-v "$(pwd)/../src:/src" \

末尾有空格!

好的:

-v "$(pwd)/../src:/src" \

斜杠后仅换行!

额外提示:某些编辑器(如 VSCode)为斜线后跟空格提供不同的颜色。


bra*_*nks 6

当我没有设置环境变量时,我遇到了这个问题。

docker push ${repo}${image_name}:${tag}
Run Code Online (Sandbox Code Playgroud)

repo并且image_name被定义但tag不是。

这导致docker push repo/image_name:.

哪个扔了 docker: invalid reference format.


Moh*_*jib 5

我在一行中执行了整个命令,因为它是这样提到的

$ docker run --name testproject-agent \
-e TP_API_KEY="REPLACE_WITH_YOUR_KEY" \
-e TP_AGENT_ALIAS="My First Agent" \
testproject/agent:latest
Run Code Online (Sandbox Code Playgroud)

但它应该是一个多行命令,我逐行复制了命令行enter在每一行和 bam 之后按下!有效。

有时当您从网络复制时,new-line字符会被省略,因此我建议尝试手动引入新行。


Cam*_*ron 5

我使用的是一个非常通用的命令

docker build .

事实证明,我只需要指定标签名称,否则就没有名称可以使用

docker build . -t image_name

然后它就起作用了。