Как определить имя изображения, созданного с помощью docker-compose

204

Я использую docker-compose для создания своей среды разработки. Я хочу создать конкретное изображение, но я не знаю, как задать имя для этого изображения.

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

Когда я выполняю docker-composeвсе в порядке, но я получаю случайное имя для нового изображения. Можно ли задать имя для образа сборки?

Роберт
источник
18
Если вы используете docker-compose для построения изображения, имя изображения всегда будет таким <project>_<service>, как <service>в этом примере, wildflyи в проекте по умолчанию используется имя каталога, в котором вы находитесь. Это можно изменить с помощью переменной среды -pили COMPOSE_PROJECT_NAME. Нет способа установить собственное имя изображения.
dnephin
1
нет приемлемых ответов?
AmanicA
docs.docker.com/docker-cloud/apps/service-links - официальный документ на эту тему
Иван Араки
2
Вы также можете установить COMPOSE_PROJECT_NAME=xв .envи ваши контейнеры будут называться{x}_{service}_{#}
eMPee584

Ответы:

181

Для формата файла docker-compose версии 2 вы можете создать и пометить образ для одного сервиса, а затем использовать этот же встроенный образ для другого сервиса.

В моем случае я хочу настроить упругий поисковый кластер с 2 узлами, оба они должны использовать одно и то же изображение, но настроенные для работы по-разному. Я также хочу создать свой собственный эластичный образ поиска из моего собственного Dockerfile. Вот что я сделал (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

Вы можете видеть, что в первом определении сервиса «es-master» я использую опцию «build» для сборки образа из файла Dockerfile в ./elasticsearch. Я помечаю изображение с именем «porter /asticsearch» с опцией «изображение». Затем я ссылаюсь на этот встроенный образ в определении сервиса «es-node» с опцией «image», а также использую «зависящий_он», чтобы убедиться, что другой контейнер «es-master» собран и запущен первым.

Джейсон Уайт
источник
56
Вариант container_name:действительно помог.
Бруно Биери
2
Вы уверены, что это работает? buildи imageявляются взаимоисключающими. Я получаю: «В Service xxx указан как образ, так и путь сборки. Служба может быть либо создана для образа, либо использовать существующий образ, но не оба».
Бурхан Али
3
О, неважно. Эти два могут использоваться вместе в формате v2 и далее. То, что я тестировал, не указывало версию, поэтому я предположил, что это v1.
Бурхан Али
3
Опция container_name: действительно помогла мне спасибо
lanni654321
2
@BrunoBieri depends_onиспользует имя службы в doker-composeфайле, нет необходимости указывать имя контейнера. Даже пример показывает это, depends_on: es-masterа неdepends_on: es_master
blueFast
65

Согласно docker-compose 1.6.0 :

Теперь вы можете указать как сборку, так и ключ изображения, если вы используете новый формат файла. docker-compose buildсоздаст изображение и пометит его указанным вами именем, а docker-compose pullтакже попытается вытащить его.

Так что ваш docker-compose.ymlбудет

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

Обновить docker-compose

sudo pip install -U docker-compose==1.6.0
arulraj.net
источник
1
ОШИБКА: проверка не удалась, причина (ы): в cornsoup указан образ и путь сборки. Служба может быть построена для изображения или использовать существующее изображение, но не то и другое одновременно. (docker-compose 1.6.2)
zx1986
@ zx1986, для этого вам нужно использовать новую версию файла docker-compose.yml, перейдите по ссылке docs.docker.com/compose/compose-file/#upgrading Основываясь на этом обновленном моем ответе
arulraj.net
50

Вариант 1. Подсказка имени изображения по умолчанию

Имя изображения, сгенерированного docker-compose, по умолчанию зависит от имени папки, но вы можете переопределить его, используя --project-nameаргумент:

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

Вариант 2. Указание имени изображения

Когда выйдет docker-compose 1.6.0 , вы можете указать build:и image:иметь явное имя изображения (см . Ответ arulraj.net ).

Вариант 3: Создать изображение из контейнера

Третье - создать изображение из контейнера:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Wernight
источник
1
--project-nameкажется, больше не принимаются. Использование 1.23.2
Стивен
21

В зависимости от вашего варианта использования, вы можете использовать изображение, которое уже было создано, и указать его имя в docker-compose.

У нас есть производственный вариант использования, где наш CI-сервер создает именованный образ Docker. ( docker build -t <specific_image_name> .). Как только названное изображение указано, наше docker-composeвсегда строится из определенного изображения. Это дает несколько разных возможностей:

1. Вы можете быть уверены, что где бы вы ни работали docker-compose, вы всегда будете использовать самую последнюю версию этого конкретного изображения.

2- Вы можете указать несколько именованных изображений в вашем docker-composeфайле и разрешить их автоматическое подключение через предыдущий шаг сборки.

Итак, если ваше изображение уже построено, вы можете назвать его с помощью docker-compose. Удалить buildи указатьimage:

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-
источник
10

после того, как вы создадите свой образ, сделайте следующее:

docker tag <image id> mynewtag:version

после этого вы увидите, что ваше изображение больше не называется, <none>когда вы идете docker images.

GHETTO.CHiLD
источник
3
Можно ли указать теги с помощью docker-compose?
Роберт
В настоящее время теги не поддерживаются.
GHETTO.CHiLD
1
Таким образом, я должен создать изображение, а затем повторно пометить его? Не очень полезно, надеюсь, docker-compose быстро решит эту проблему?
Роберт
1
если вы создаете много контейнерную среду, да. если вы создаете одну контейнерную среду, вы всегда можете пойтиdocker build -t mytag:version .
GHETTO.CHiLD