docker: formato de referência inválido

104

Estou seguindo este tutorial: https://medium.com/towards-data-science/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c

e eles usam o docker. Quando tentei executar o docker (dentro do script run.sh):

docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash

Eu entendi o erro:

docker: invalid reference format.

Passei 2 horas e não consigo entender o que há de errado. Qualquer ideia realmente apreciada.

ai2016
fonte
3
Experimente istodocker run -p 8888:8888 -v "`pwd`/../src":/src -v "`pwd`/../data":/data -w /src --rm -it supervisely_anpr bash
Tarun Lalwani
5
Como @TarunLalwani e @Oleg mencionaram, você precisará mover o --rme -itentre rune o nome da imagem. Isso não explica a mensagem de erro, no entanto. Você verificou se os caracteres do nome da imagem não têm codificação especial ou maiúsculas? Copiar e colar do seu snippet funciona para mim, enquanto docker run --rm foo! bashimprime o mesmo erro como o seu.
gesellix
3
considerando postar uma resposta para isso é mais fácil de encontrar para o próximo cara
lloiacono
4
Sempre aspas duplas expansões em dólares, a menos que você realmente queira dividir a string em palavras. Aqui, use "$(pwd)"(forma moderna de "`pwd`"). Seu comando se torna docker run -p 8888:8888 -v "$(pwd)"/../src:/src -v "$(pwd)"/../data:/data -w /src supervisely_anpr --rm -it bash.
Martin Jambon de
1
@gesellix obrigado. Copiar e colar comandos de manuais não deve ser feito em primeiro lugar ao aprender coisas novas, além de que pode trazer uma dor inesperada quando algum símbolo corrompido sorrateiramente é envolvido. Ainda bem que vi o seu comentário antes de passar duas horas ou meio dia nesse "erro" ^ _ ^
Den Drobiazko

Respostas:

88

No PowerShell você deve usar ${pwd}vs$(pwd)

Levon Petrosyan
fonte
7
ISTO é o que me fez bater minha cabeça na parede (às vezes eu odeio M $ FT)
beerwin
docker run --rm -ti --name zalenium -p 4444:4444 -p 5555:5555 \ -e SAUCE_USERNAME -e SAUCE_ACCESS_KEY \ -v /tmp/videos:/home/seluser/videos \ -v /var/run/docker.sock:/var/run/docker.sock \ dosel/zalenium start --sauceLabsEnabled trueo que há de errado com meu comando? Também está dando mesmo erro.
paul
Muito obrigado!
Andrew Brennan
45

O primeiro argumento após a "execução" que não é um sinalizador ou parâmetro para um sinalizador é analisado como um nome de imagem. Quando essa análise falha, ele informa que o formato de referência, também conhecido como nome da imagem (mas pode ser um id de imagem, imagem fixada ou outra sintaxe), é inválido. Em seu comando:

 docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash

O nome da imagem "supervisely_anpr" é válido, então você precisa olhar antes no comando. Nesse caso, o erro provavelmente é pwdcausado pela saída de um caminho com um espaço. Tudo o que vem depois do espaço não é mais um parâmetro para -ve o docker tenta analisá-lo como o nome da imagem. A correção é citar os parâmetros de volume quando você não pode garantir que não haja espaços ou outros caracteres especiais.

Ao fazer isso, você encontrará o próximo erro, "executável não encontrado". Tudo após o nome da imagem é analisado como o comando a ser executado dentro do contêiner. No seu caso, ele tentará executar o comando --rm -it bashque quase certamente falhará, pois --rmnão existirá como um binário dentro de sua imagem. Você precisa reordenar os parâmetros para resolver isso:

 docker run --rm -it -p 8888:8888 -v "`pwd`/../src:/src" -v "`pwd`/../data:/data" -w /src supervisely_anpr  bash

Tenho mais alguns detalhes sobre esses dois erros e causas em meus slides aqui: https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow-lightning.html#29

BMitch
fonte
3
O slide 30 resolveu meu problema. Eu tinha um arquivo .sh em execução no Cygwin. Mudei # !/bin/bash(observe o espaço entre #e !para #!/bin/bash e depois End of Line Sequencede CRLFpara LF. Foi tudo o que fiz. Obrigado @BMitch por compartilhar os slides.
blongho
10

Eu tive o mesmo problema quando eu copy-pastedo comando. Em vez disso, quando digitei o comando inteiro, funcionou!

Boa sorte...

Akash
fonte
2
Uau, isso realmente ajudou.
Matjag
3
Sim, para mim, foi --namecolado -devido à alteração automática do editor. Obrigado, você economizou meu tempo.
Rvy Pandey
7

Eu tive um problema parecido. O problema que eu estava tendo era que $(pwd)havia um espaço que estava jogando o docker para fora.

Mude o nome do diretório para não ter espaços, e deve funcionar se este for o problema

Yashvier Kosaraju
fonte
3

Eu tive esse problema quando não tinha uma variável de ambiente definida.

docker push ${repo}${image_name}:${tag}

repoe image_nameforam definidos, mas tagnão foram.

Isso resultou em docker push repo/image_name:.

Que jogou o docker: invalid reference format.

Brandonbanks
fonte
Eu tive o mesmo problema e o resolvi definindo a variável de ambiente ausente export tag = latest
PHZ.fi-Pharazon 01 de
1

Descobriu que usando docker-compose configrelatou qual era o problema.

No meu caso, um arquivo de composição de substituição com uma entrada que não substituía nada .

user12272112
fonte
0

Isso também acontece quando você usa a composição do docker de desenvolvimento, como a seguir, na produção. Você não quer construir imagens em produção, pois isso quebra a ideologia dos contêineres. Devemos implantar imagens:

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"

Altere isso para usar a imagem construída:

  web:
    command: /bin/bash run.sh
    image: registry.voxcloud.co.za:9000/dyndns_api_web:0.1
    ports:
      - "8000:8000"
Stephen
fonte