我遵循使用Docker的这教程。当我试图运行Docker(在run.sh脚本中):
docker run \ -p 8888:8888 -v `pwd`/../src:/src \ -v `pwd`/../data:/data -w /src supervisely_anpr \ --rm \ -it \ bash
我得到了错误:
docker: invalid reference format.
我花了两个小时,我真的不明白哪里出了问题。任何想法都非常感谢。
“run”之后的第一个不是标志或标志参数的参数将被解析为图像名称。当解析失败时,它会告诉您引用格式,即图像名称(也可以是图像id、固定图像或其他语法)无效。由你指挥:
docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
图像名称“监ely_anpr”是有效的,因此需要查看命令的前面部分。在这种情况下,错误很可能来自pwd输出一个包含空格的路径。空格之后的所有内容不再是-v的参数,docker试图将其解析为图像名称。修复方法是在不能保证卷参数没有空格或其他特殊字符时引用卷参数。
pwd
-v
当您这样做时,您将遇到下一个错误,“未找到可执行文件”。映像名称之后的所有内容都被解析为要在容器内运行的命令。在你的情况下,它将尝试运行命令--rm -it bash,这几乎肯定会失败,因为--rm在你的图像中不会作为二进制文件存在。你需要重新排序参数来解决这个问题:
--rm -it bash
--rm
docker run --rm -it -p 8888:8888 -v "`pwd`/../src:/src" -v "`pwd`/../data:/data" -w /src supervisely_anpr bash
我在这里的幻灯片中有关于这两个错误和原因的更多细节:https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow-lightning.html#29
在powershell中,您应该使用${pwd}而不是$(pwd)
${pwd}
$(pwd)
将目录名更改为不包含空格,如果这是问题所在,它应该可以工作
当您在生产中使用开发docker组合时,也会发生这种情况。您不希望在生产环境中构建映像,因为这会破坏容器的意识形态。我们应该部署图像:
web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000"
更改为使用构建的映像:
web: command: /bin/bash run.sh image: registry.example.com:9000/dyndns_api_web:0.1 ports: - "8000:8000"
我有同样的问题,当我copy-pasted命令。相反,当我输入整个命令时,它工作了!
copy-pasted
祝你好运…
发现使用docker-compose config报告问题是什么。
docker-compose config
在我的例子中,是一个覆盖组成文件,其中的条目是压倒一切的不。
我在没有设置环境变量时遇到了这个问题。
docker push ${repo}${image_name}:${tag}
repo和image_name被定义,但tag没有。
repo
image_name
tag
这导致docker push repo/image_name:。
docker push repo/image_name:
哪个抛出docker: invalid reference format.
其他人来这里: 如果你碰巧把docker命令放在一个文件中,比如run.sh,检查你的行分隔符。在Linux中,它应该是LR,否则你会得到同样的错误
run.sh
LR
我在一行中执行了整个命令,正如上面提到的那样
$ docker run --name testproject-agent \ -e TP_API_KEY="REPLACE_WITH_YOUR_KEY" \ -e TP_AGENT_ALIAS="My First Agent" \ testproject/agent:latest
但它应该是一个多行命令,并且我逐行复制了命令行并在每一行之后按enter,砰!它工作。
enter
有时,当你复制网页时,new-line字符会被省略,因此我建议尝试手动引入新行。
new-line
我在通过powershell使用$(pwd)时遇到了同样的问题,我用${pwd}替换了它,它为我工作。
以下是相同的细节:
PS C:\Users\Systems\git\mastery\dockerfile> docker container run -d --name nginx -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx docker: invalid reference format. See 'docker run --help'. PS C:\Users\Systems\git\mastery\dockerfile> docker container run -d --name nginx -p 8080:80 -v ${pwd}:/usr/share/nginx/html nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx Digest: sha256:25975292693bcc062becc20a1608936927f9950a42fb4474088f6292dacd4ec9 Status: Downloaded newer image for nginx:latest f6ff08ed3b73095e85474bd2f248a7cae6b5bcdb53e12e4824d235df3cd268aa
我在Linux上也遇到了同样的问题。这是因为目录名中包含空格。我通过使用"$(pwd)/path/to/go"而不是$(pwd)/path/to/go来修复它
"$(pwd)/path/to/go"
$(pwd)/path/to/go
我删除了()并像这样为我工作 docker run -d -v $pwd/envoy.yaml:/etc/envoy/envoy.yaml:ro -p 8080:8080 -p 9901:9901 我正在使用windows 10
()
docker run -d -v $pwd/envoy.yaml:/etc/envoy/envoy.yaml:ro -p 8080:8080 -p 9901:9901
我使用的是一个非常通用的命令
docker build .
结果证明,我只需要指定标记名称,否则就没有名称可使用
docker build . -t image_name
然后就成功了。
在我的情况下,问题是在完整的路径文件夹与回购,我使用终端&码头工人。我是这样的: repo (1)/repo/ 将文件夹重命名为 repo/repo 它将帮助
repo (1)/repo/
repo/repo
在我的例子中,命令是这样的
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
我试图在一行中复制所有内容,包括斜杠(\),并得到以下错误
命令中的斜杠(\)表示下一行,因此如果您试图在一行中运行完整的命令,只需删除斜杠(\),这对我来说是可行的
谢谢:)
我遇到的一个问题是,在我的skaffold config list -a的配置中,我的默认回购被设置为https://docker-registry.url.com,如下所示:
skaffold config list -a
https://docker-registry.url.com
kubeContexts: - kube-context: minikube default-repo: https://docker-registry.url.com
但是,正确的方法应该没有https://:
https://
kubeContexts: - kube-context: minikube default-repo: docker-registry.url.com
如果使用窗户,则在CMD而不是PowerShell上运行它。
如果其他人击中它,则导致此错误的另一个变体是由路径规范上的末尾/或\引起的。
即-v c:\mystuff:c:\mappedfolder工作
-v c:\mystuff:c:\mappedfolder
but: -v c:\mystuff\:c:\mappedfolder没有
-v c:\mystuff\:c:\mappedfolder
哪里有额外的"\"在mystuff的末尾
"\"
mystuff
所以在我的情况下,问题是命令是“非法的”,也就是说。以一种不受支持的格式,这是我在官方文档中发现它后最不希望发生的事情,但它就是这样。确保您使用了正确的命令。
另一种可能出现这种情况的情况是当您缺少要运行的映像时。
只是提醒一下:如果你路径中的任何文件夹中有空格,请删除它。例如,如果其中一个文件夹的名称是my folder,则将其更改为my-folder。
my folder
my-folder
如果你在windows PowerShell中运行脚本,你需要用花括号将$ (pwd)替换为$ {pwd}。
有时问题在于行末的额外空格。
缺点:😭
-v "$(pwd)/../src:/src" \
空间在最后!
好:🤩
斜杠后面只有换行符 !
额外提示:一些编辑器(如VSCode)给斜杠后面的空格赋予不同的颜色。