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.


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)


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


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...


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


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.


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 .


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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.