Como defino o nome da imagem criada com o docker-compose

203

Estou usando o docker-compose para criar meu ambiente de desenvolvimento. Quero criar uma imagem específica, mas não sei como definir um nome para essa imagem.

wildfly:
  build: /path/to/dir/Dockerfile
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server

Quando executo docker-composetudo está ok, mas recebo um nome aleatório para a nova imagem. É possível definir um nome para a imagem de compilação?

Robert
fonte
17
Se você estiver usando o docker-compose para criar a imagem, o nome da imagem sempre estará <project>_<service>, onde <service>neste exemplo está o wildflypadrão do projeto e o nome do diretório em que você está. Você pode alterar isso com a variável de ambiente -pou COMPOSE_PROJECT_NAME. Não há como definir um nome de imagem personalizado.
precisa saber é
1
não há respostas aceitáveis?
AmanicA
docs.docker.com/docker-cloud/apps/service-links - documento oficial sobre este assunto
Ivan Aracki
2
você também pode definir COMPOSE_PROJECT_NAME=xno .enve seus recipientes será chamado{x}_{service}_{#}
eMPee584

Respostas:

181

No formato de arquivo docker-compose versão 2, é possível criar e marcar uma imagem para um serviço e, em seguida, usar a mesma imagem criada para outro serviço.

Para o meu caso, quero configurar um cluster de pesquisa elástico com 2 nós, ambos precisam usar a mesma imagem, mas configurados para executar de maneira diferente. Também quero criar minha própria imagem de elasticsearch personalizada a partir do meu próprio Dockerfile. Então foi isso que eu fiz (docker-compose.yml):

version: '2'

services:
  es-master:
    build: ./elasticsearch
    image: porter/elasticsearch
    ports:
      - "9200:9200"
    container_name: es_master

  es-node:
    image: porter/elasticsearch
    depends_on:
      - es-master
    ports:
      - "9200"
    command: elasticsearch --discovery.zen.ping.unicast.hosts=es_master

Você pode ver que, na primeira definição de serviço "es-master", eu uso a opção "build" para criar uma imagem do Dockerfile em ./elasticsearch. Eu identifico a imagem com o nome "porter / elasticsearch" com a opção "image". Em seguida, faço referência a esta imagem criada na definição de serviço "es-node" com a opção "image" e também uso um "depende_on" para garantir que o outro contêiner "es-master" seja construído e executado primeiro.

Jason White
fonte
55
A opção container_name:realmente ajudou.
Bruno Bieri 07/10
2
Tem certeza de que isso funciona? builde imagesão mutuamente exclusivos. Recebo "O serviço xxx tem uma imagem e um caminho de construção especificados. Um serviço pode ser criado para criar uma imagem ou usar uma imagem existente, não as duas".
Burhan Ali
3
Oh, deixa pra lá. Esses dois podem ser usados ​​juntos no formato v2 e em diante. O que eu estava testando não especificou uma versão, então acho que foi assumido como v1.
Burhan Ali
3
O container_name opção: realmente me ajudou thks
lanni654321
2
@BrunoBieri depends_onusa o nome do serviço no doker-composearquivo, não é necessário especificar um nome de contêiner. Até mesmo o exemplo mostra-lo depends_on: es-mastere nãodepends_on: es_master
blueFast
65

Conforme o docker-compor 1.6.0 :

Agora você pode especificar uma compilação e uma chave de imagem se estiver usando o novo formato de arquivo. docker-compose buildcriará a imagem e marcará com o nome que você especificou, enquanto docker-compose pulltentará puxá-la.

Então o seu docker-compose.ymlseria

version: '2'
services:
  wildfly:
      build: /path/to/dir/Dockerfile
      image: wildfly_server
      ports:
       - 9990:9990
       - 80:8080

Para atualizar o docker-compose

sudo pip install -U docker-compose==1.6.0
arulraj.net
fonte
1
ERRO: Falha na validação, motivo (s): o cornsoup possui um caminho de imagem e de construção especificado. Um serviço pode ser criado para criar uma imagem ou usar uma imagem existente, não as duas. (docker-compose 1.6.2)
zx1986 16/16
@ zx1986 para isso, você deve usar a nova versão do arquivo docker- compose.yml, consulte este docs.docker.com/compose/compose-file/#upgrading Com base nessa resposta atualizada
arulraj.net
50

Opção 1: Sugestão do nome da imagem padrão

O nome da imagem gerada pelo docker-compose depende do nome da pasta por padrão, mas você pode substituí-la usando o --project-nameargumento:

$ docker-compose --project-name foo build bar
$ docker images foo_bar

Opção 2: Especificando o nome da imagem

Uma vez estivador-compor 1.6.0 está fora, você pode especificar build:e image:ter um nome de imagem explícita (ver resposta de arulraj.net ).

Opção 3: criar imagem do contêiner

Um terceiro é criar uma imagem do contêiner:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Wernight
fonte
1
--project-namenão parece mais ser aceito. Usando 1.23.2
Steven Vachon
21

Dependendo do seu caso de uso, você pode usar uma imagem que já foi criada e especificar seu nome docker-compose.

Temos um caso de uso de produção em que nosso servidor de IC cria uma imagem nomeada do Docker. (docker build -t <specific_image_name> . ) Depois que a imagem nomeada é especificada, nossadocker-compose sempre criamos a imagem específica. Isso permite algumas possibilidades diferentes:

1- Você pode garantir que, onde quer que você execute seu docker-compose , sempre estará usando a versão mais recente dessa imagem específica.

2- Você pode especificar várias imagens nomeadas em seu docker-compose arquivo e permitir que elas sejam conectadas automaticamente na etapa de compilação anterior.

Portanto, se sua imagem já estiver construída, você poderá nomear a imagem docker-compose. Remova builde especifiqueimage:

wildfly:
  image: my_custom_wildfly_image
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server
meoww-
fonte
10

depois de criar sua imagem, faça o seguinte:

docker tag <image id> mynewtag:version

depois disso, você verá que sua imagem não será mais chamada <none>quando você for docker images.

GHETTO.CHiLD
fonte
3
É possível especificar as tags com docker-compose?
Robert
As tags não parecem ter suporte no momento.
GHETTO.CHiLD 26/08
1
Então eu tenho que construir a imagem e depois re-etiquetá-la? Não é realmente útil, espero que o docker-compose resolva esse problema rapidamente?
Robert
1
se você estiver construindo um ambiente com vários contêineres, sim. se você está construindo um ambiente único recipiente que você pode sempre irdocker build -t mytag:version .
GHETTO.CHiLD