Як визначити назву зображення, побудованого за допомогою докер-композиту


206

Я використовую 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середовища. Немає можливості встановити спеціальне ім’я зображення.
деньфін

1
чи немає прийнятних відповідей?
AmanicA

docs.docker.com/docker-cloud/apps/service-links - офіційний документ з цього приводу
Іван Арацький

2
Ви також можете встановити COMPOSE_PROJECT_NAME=xв .envі ваші контейнери будуть називатися{x}_{service}_{#}
eMPee584

Відповіді:


184

Для формату файлів версії 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 / elasesearch" за допомогою параметра "image". Потім я посилаюсь на це вбудоване зображення у визначенні послуги "es-node" з параметром "image", а також використовую "залежно_on", щоб переконатися, що інший контейнер "es-master" побудований і запускається першим.


57
Варіант container_name:справді допоміг.
Бруно Бієрі

2
Ви впевнені, що це працює? buildі imageє взаємовиключними. Я отримую "У сервісі xxx вказано і зображення, і шлях збірки. Служба може бути побудована для зображення або використовувати наявне зображення, а не обидва".
Бурхан Алі

3
О, неважливо. Ці два можна використовувати разом у форматі v2 і далі. Те, що я тестував, не вказувало версію, тому я вважаю, що це v1.
Бурхан Алі

3
Опція контейнер_ім'я: дійсно допомогла мені thks
lanni654321

2
@BrunoBieri depends_onвикористовує ім’я служби у doker-composeфайлі, не потрібно вказувати ім’я контейнера. Навіть приклад показує це, depends_on: es-masterа неdepends_on: es_master
blueFast

65

Відповідно до докер-композиту 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

Оновити докер-композицію

sudo pip install -U docker-compose==1.6.0

1
ПОМИЛКА: Перевірка не вдалася, причина (и): cornsoup вказано як зображення, так і шлях побудови. Служба може бути побудована для зображення або використання наявного зображення, а не обох. (docker-compose 1.6.2)
zx1986

@ zx1986 для цього вам потрібно використовувати нову версію файлу docker-compose.yml, зверніться до цього docs.docker.com/compose/compose-file/#upgrading. На основі оновленої моєї відповіді
arulraj.net

50

Варіант 1: Натякання назви зображення за замовчуванням

Назва зображення, згенерованого докер-композицією, за замовчуванням залежить від назви папки, але ви можете змінити її за допомогою --project-nameаргументу:

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

Варіант 2: Вказівка ​​назви зображення

Як тільки докер-композит 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

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

10

після створення зображення зробіть наступне:

docker tag <image id> mynewtag:version

після цього ви побачите, що ваше зображення більше не називається, <none>коли ви йдете docker images.


3
Чи можна вказати теги за допомогою docker-compose?
Роберт

Наразі теги не підтримуються.
GHETTO.CHiLD

1
Тож я маю скласти зображення і пізніше повторно позначити його? Це не дуже корисно, я сподіваюся, що докер-композит швидко вирішить цю проблему?
Роберт

1
якщо ви створюєте середовище з кількома контейнерами, так. якщо ви будуєте єдине середовище для контейнерів, ви завжди можете перейтиdocker build -t mytag:version .
GHETTO.CHiLD,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.