Bagaimana cara menentukan nama gambar yang dibuat dengan docker-compose


203

Saya menggunakan komposisi buruh pelabuhan untuk membuat lingkungan pengembangan saya. Saya ingin membuat gambar tertentu, tetapi saya tidak tahu cara mengatur nama untuk gambar itu.

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

Ketika saya mengeksekusi docker-composesemuanya ok, tapi saya mendapatkan nama acak untuk gambar baru. Apakah mungkin untuk menetapkan nama ke gambar build?


17
Jika Anda menggunakan docker-compose untuk membangun gambar, nama gambar akan selalu ada <project>_<service>, <service>di mana dalam contoh ini adalah wildflydan memproyeksikan default ke nama direktori tempat Anda berada. Anda dapat mengubahnya dengan -patau COMPOSE_PROJECT_NAMEvariabel lingkungan. Tidak ada cara untuk mengatur nama gambar khusus.
dnephin

1
apakah tidak ada jawaban yang dapat diterima?
AmanicA


2
Anda juga dapat mengatur COMPOSE_PROJECT_NAME=xdalam .envdan kontainer Anda akan disebut{x}_{service}_{#}
eMPee584

Jawaban:


181

Untuk format file docker-compose versi 2, Anda dapat membuat dan memberi tag suatu gambar untuk satu layanan dan kemudian menggunakan gambar buatan yang sama untuk layanan lain.

Untuk kasus saya, saya ingin mengatur cluster pencarian elastis dengan 2 node, keduanya perlu menggunakan gambar yang sama, tetapi dikonfigurasi untuk berjalan secara berbeda. Saya juga ingin membuat gambar elasticsearch kustom saya sendiri dari Dockerfile saya sendiri. Jadi ini yang saya lakukan (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

Anda dapat melihat bahwa dalam definisi layanan pertama "es-master", saya menggunakan opsi "build" untuk membuat gambar dari Dockerfile di ./elasticsearch. Saya memberi tag pada gambar dengan nama "porter / elasticsearch" dengan opsi "image". Saya kemudian merujuk gambar yang dibangun ini dalam definisi layanan "es-simpul" dengan opsi "gambar", dan juga menggunakan "depend_on" untuk memastikan wadah lain "es-master" dibangun dan dijalankan terlebih dahulu.


55
Pilihannya container_name:sangat membantu.
Bruno Bieri

2
Apakah Anda yakin ini berhasil? builddan imagesaling eksklusif. Saya mendapatkan "Layanan xxx memiliki gambar dan jalur pembuatan yang ditentukan. Layanan dapat dibangun untuk gambar atau menggunakan gambar yang ada, bukan keduanya."
Burhan Ali

3
Oh ya sudah. Keduanya dapat digunakan bersama dalam format v2 dan seterusnya. Hal yang saya uji tidak menentukan versi jadi saya kira diasumsikan sebagai v1.
Burhan Ali

3
Opsi container_name: benar-benar membantu saya thks
lanni654321

2
@ BrunoBieri yang depends_onmenggunakan nama layanan dalam doker-composefile, tidak perlu menentukan nama wadah. Bahkan contohnya menunjukkan depends_on: es-masterdan tidakdepends_on: es_master
blueFast

65

Sesuai docker-compose 1.6.0 :

Sekarang Anda dapat menentukan build dan kunci gambar jika Anda menggunakan format file baru. docker-compose buildakan membuat gambar dan menandainya dengan nama yang telah Anda tentukan, sementara docker-compose pullakan berusaha untuk menariknya.

Jadi kamu docker-compose.ymlakan menjadi

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

Untuk memperbarui komposisi buruh pelabuhan

sudo pip install -U docker-compose==1.6.0

1
GALAT: Validasi gagal, alasan: cornsoup memiliki gambar dan jalur pembangunan yang ditentukan. Layanan dapat dibangun untuk gambar atau menggunakan gambar yang ada, bukan keduanya. (docker-compose 1.6.2)
zx1986

@ zx1986 untuk itu Anda harus menggunakan versi baru file docker- compose.yml lihat dokumen inis.docker.com/compose/compose-file/#upgrading Berdasarkan yang dimutakhirkan jawaban saya
arulraj.net

50

Opsi 1: Mengisyaratkan nama gambar default

Nama gambar yang dihasilkan oleh docker-compose tergantung pada nama folder secara default tetapi Anda dapat menimpanya dengan menggunakan --project-nameargumen:

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

Opsi 2: Menentukan nama gambar

Setelah docker-compose 1.6.0 keluar, Anda dapat menentukan build:dan image:memiliki nama gambar eksplisit (lihat jawaban arulraj.net ).

Opsi 3: Buat gambar dari wadah

Yang ketiga adalah membuat gambar dari wadah:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar

1
--project-namesepertinya tidak diterima lagi. Menggunakan 1.23.2
Steven Vachon

21

Tergantung pada kasus penggunaan Anda, Anda dapat menggunakan gambar yang telah dibuat dan tentukan namanya docker-compose.

Kami memiliki kasing produksi di mana server CI kami membuat gambar bernama Docker. ( docker build -t <specific_image_name> .). Setelah gambar bernama ditentukan, kami docker-composeselalu membangun dari gambar tertentu. Ini memungkinkan beberapa kemungkinan berbeda:

1- Anda dapat memastikan bahwa dari mana pun Anda menjalankannya docker-compose, Anda akan selalu menggunakan versi terbaru dari gambar spesifik itu.

2- Anda dapat menentukan beberapa gambar bernama dalam docker-composefile Anda dan membiarkannya terhubung secara otomatis melalui langkah build sebelumnya.

Jadi, jika gambar Anda sudah dibuat, Anda dapat memberi nama gambar tersebut docker-compose. Hapus builddan tentukanimage:

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

setelah Anda membangun gambar Anda lakukan hal berikut:

docker tag <image id> mynewtag:version

setelah itu Anda akan melihat gambar Anda tidak lagi bernama <none>ketika Anda pergi docker images.


3
Apakah mungkin untuk menentukan tag dengan komposisi docker?
Robert

tag tidak terlihat didukung saat ini.
GHETTO.CHiLD

1
Jadi saya harus membuat gambar dan kemudian menandai ulang? Tidak benar-benar berguna, saya harap buruh pelabuhan-memperbaiki masalah ini dengan cepat?
Robert

1
jika Anda membangun lingkungan multi-kontainer ya. jika Anda sedang membangun lingkungan wadah tunggal Anda selalu dapat pergidocker build -t mytag:version .
GHETTO.CHiLD
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.