Como definir o nome da imagem no Dockerfile?

299

Você pode definir o nome da imagem ao criar uma imagem personalizada, assim:

docker build -t dude/man:v2 . # Will be named dude/man:v2

Existe uma maneira de definir o nome da imagem no Dockerfile, para que eu não precise mencioná-lo no docker buildcomando?

gvlasov
fonte
1
Para qualquer um curioso, usando FROM ... AS nome não funciona
Rufus

Respostas:

267

A marcação da imagem não é suportada dentro do Dockerfile. Isso precisa ser feito no seu comando de construção. Como solução alternativa, você pode fazer a construção com um docker-compose.yml que identifique o nome da imagem de destino e, em seguida, execute a docker-compose build. Uma amostra docker-compose.yml seria semelhante a

version: '2'

services:
  man:
    build: .
    image: dude/man:v2

Dito isto, há um esforço contra fazer a compilação com composição, pois isso não funciona com implantações no modo enxame. Então, você voltou a executar o comando conforme indicado em sua pergunta:

docker build -t dude/man:v2 .

Pessoalmente, costumo construir com um pequeno script de shell na minha pasta (build.sh) que passa qualquer argumento e inclui o nome da imagem para salvar a digitação. E para produção, a compilação é manipulada por um servidor ci / cd que possui o nome da imagem dentro do script de pipeline.

BMitch
fonte
303

Como criar uma imagem com nome personalizado sem usar o arquivo yml:

docker build -t image_name .

Como executar um contêiner com nome personalizado:

docker run -d --name container_name image_name
salehinejad
fonte
78
Não vou comentar mais, mas a pergunta era "Como definir o nome da imagem no Dockerfile?" Não é "Como definir o nome da imagem do docker?" Essa resposta estava na própria pergunta.
Novaterata 07/07
68
Tenho de voltar a este um par de vezes, e esta resposta tem ajudado, apesar de ser tecnicamente off-topic
gdbj
7
Se você for consistente ao colocar o Dockerfilediretório em um diretório com o mesmo nome que deseja para sua imagem, poderá usar docker build -t $(basename $PWD) .como seu comando de construção. Em seguida, você pode usar a pesquisa CTRL-R em "build" para localizar e reutilizar o comando e nunca precisar editá-lo. Você também pode criar um alias, se quiser.
de Bruno Bronosky
De qualquer forma, obrigado por esta resposta. eu estava gastando algumas horas para conseguir isso pela internet. Eu não consegui uma resposta adequada, alguém que dê nome à sua imagem não pode ir mais longe sem isso, se precisar de nome para o seu recipiente também.
Susaj S Nair 02/04
38

Aqui está outra versão se você precisar fazer referência a um arquivo docker específico:

version: "3"
services:
  nginx:
    container_name: nginx
    build:
      context: ../..
      dockerfile: ./docker/nginx/Dockerfile
    image: my_nginx:latest

Então você apenas corre

docker-compose build
David Dehghan
fonte
1
Eu gosto que esta resposta mostre a diferença entre o container_name e o nome da imagem: tag. Se houvesse um pouco mais de explicação sobre o que está acontecendo: "container_name" nomeia o contêiner que acabou gerando a partir da imagem. "image" nomeia e marca a imagem criada, a partir da qual o contêiner é construído. Como outros já mencionaram, não é possível especificar o nome da imagem no Dockerfile, como o OP pediu, então usamos o arquivo docker-compose.yml e o executamos com "docker-compose up -d --build"
Sean McCarthy
-7

Você pode fazer isso usando 'AS' FROM ubuntu: 16.04 AS FooImage

Richard
fonte
6
A ASsintaxe especifica o nome do destino usado em uma construção de vários estágios, e esse nome também pode ser usado no lugar de uma imagem para a COPY --fromsintaxe nessa construção de vários estágios. No entanto, ele não especifica o nome / tag resultante para a compilação em si.
BMitch