ฉันจะกำหนดชื่อของภาพที่สร้างขึ้นด้วยองค์ประกอบนักเทียบท่าได้อย่างไร


206

ฉันใช้นักแต่งเพื่อสร้างสภาพแวดล้อมการพัฒนาของฉัน ฉันต้องการสร้างภาพเฉพาะ แต่ฉันไม่ทราบวิธีตั้งชื่อให้กับภาพนั้น

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
หากคุณใช้นักเทียบท่าเพื่อสร้างภาพชื่อภาพจะเป็นเช่นนี้เสมอ<project>_<service>โดยที่<service>ในตัวอย่างนี้wildflyและค่าเริ่มต้นของโครงการเป็นชื่อไดเรกทอรีที่คุณเข้าคุณสามารถเปลี่ยนด้วย-pหรือCOMPOSE_PROJECT_NAMEตัวแปรสภาพแวดล้อม ไม่มีวิธีตั้งชื่อภาพที่กำหนดเอง
dnephin

1
ไม่มีคำตอบที่ยอมรับได้?
AmanicA

docs.docker.com/docker-cloud/apps/service-links - เอกสารอย่างเป็นทางการเกี่ยวกับเรื่องนี้
Ivan Aracki

2
คุณยังสามารถตั้งค่าCOMPOSE_PROJECT_NAME=xใน.envและภาชนะบรรจุของคุณจะถูกเรียกว่า{x}_{service}_{#}
eMPee584

คำตอบ:


184

สำหรับรูปแบบไฟล์เวอร์ชัน docker-compose คุณสามารถสร้างและแท็กอิมเมจสำหรับบริการหนึ่งจากนั้นใช้อิมเมจที่สร้างขึ้นนั้นเหมือนกันสำหรับบริการอื่น

สำหรับกรณีของฉันฉันต้องการตั้งค่าคลัสเตอร์การค้นหาแบบยืดหยุ่นที่มี 2 โหนดทั้งคู่ต้องใช้ภาพเดียวกัน แต่กำหนดค่าให้ทำงานต่างกัน ฉันยังต้องการสร้างภาพ ElasticSearch ที่กำหนดเองจาก 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 ใน. /elearchearch ฉันแท็กรูปภาพด้วยชื่อ "porter / elasticsearch" ด้วยตัวเลือก "image" ฉันอ้างอิงรูปภาพที่สร้างขึ้นนี้ในคำจำกัดความบริการ "es-node" ด้วยตัวเลือก "image" และใช้ "depend_on" เพื่อให้แน่ใจว่าคอนเทนเนอร์อื่น "es-master" นั้นถูกสร้างขึ้นและเรียกใช้ก่อน


57
ตัวเลือกcontainer_name:ช่วยได้จริงๆ
Bruno Bieri

2
คุณแน่ใจเหรอ buildและimageเป็นเอกสิทธิ์เฉพาะบุคคล ฉันได้รับ "Service xxx มีทั้งรูปภาพและพา ธ บิลด์ที่ระบุบริการสามารถสร้างเป็นรูปภาพหรือใช้รูปภาพที่มีอยู่ไม่ใช่ทั้งสองอย่าง"
Burhan Ali

3
โอ้ไม่เป็นไร ทั้งสองสามารถใช้ร่วมกันในรูปแบบ v2 และต่อไป สิ่งที่ฉันทดสอบไม่ได้ระบุเวอร์ชันดังนั้นฉันเดาว่าจะเป็น v1
Burhan Ali

3
container_name ตัวเลือก: ช่วยฉันได้มากจริงๆ
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 มีทั้งรูปภาพและเส้นทางที่ระบุ บริการสามารถสร้างเป็นรูปภาพหรือใช้รูปภาพที่มีอยู่ไม่ใช่ทั้งสองอย่าง (นักเทียบท่าเขียน 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
Steven Vachon

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
Robert

แท็กไม่ได้รับการสนับสนุนในขณะนี้
GHETTO.CHiLD

1
ดังนั้นฉันต้องสร้างภาพและติดแท็กใหม่ในภายหลัง ไม่มีประโยชน์จริง ๆ ฉันหวังว่าการประกอบนักเทียบท่าจะแก้ไขปัญหานี้ได้อย่างรวดเร็ว
Robert

1
หากคุณกำลังสร้างสภาพแวดล้อมแบบหลายคอนเทนเนอร์ใช่ หากคุณกำลังสร้างสภาพแวดล้อมแบบตู้เดียวคุณสามารถไปได้ตลอดเวลาdocker build -t mytag:version .
GHETTO.CHiLD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.