Làm cách nào để xác định tên của hình ảnh được tạo bằng docker-compose


203

Tôi đang sử dụng docker-compose để tạo môi trường phát triển của mình. Tôi muốn xây dựng một hình ảnh cụ thể, nhưng tôi không biết cách đặt tên cho hình ảnh đó.

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

Khi tôi thực hiện docker-composemọi thứ đều ổn, nhưng tôi nhận được một tên ngẫu nhiên cho hình ảnh mới. Có thể đặt tên cho hình ảnh xây dựng?


17
Nếu bạn đang sử dụng docker-compose để xây dựng hình ảnh, tên hình ảnh sẽ luôn tồn tại <project>_<service>, <service>trong ví dụ này là wildflyvà dự án mặc định cho tên thư mục bạn đang ở. Bạn có thể thay đổi tên đó bằng -phoặc COMPOSE_PROJECT_NAMEbiến môi trường. Không có cách nào để đặt tên hình ảnh tùy chỉnh.
dnephin

1
không có câu trả lời chấp nhận được?
AmanicA

docs.docker.com/docker-cloud/apps/service-links - tài liệu chính thức về chủ đề này
Ivan Aracki

2
bạn cũng có thể thiết lập COMPOSE_PROJECT_NAME=xtrong .envvà container của bạn sẽ được gọi là{x}_{service}_{#}
eMPee584

Câu trả lời:


181

Đối với định dạng tệp docker-compose phiên bản 2, bạn có thể xây dựng và gắn thẻ hình ảnh cho một dịch vụ và sau đó sử dụng hình ảnh được xây dựng tương tự cho dịch vụ khác.

Trong trường hợp của tôi, tôi muốn thiết lập một cụm tìm kiếm đàn hồi với 2 nút, cả hai đều cần sử dụng cùng một hình ảnh, nhưng được cấu hình để chạy khác nhau. Tôi cũng muốn xây dựng hình ảnh tìm kiếm tùy chỉnh của riêng mình từ Dockerfile của riêng tôi. Vì vậy, đây là những gì tôi đã làm (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

Bạn có thể thấy rằng trong định nghĩa dịch vụ đầu tiên "es-master", tôi sử dụng tùy chọn "xây dựng" để xây dựng hình ảnh từ Dockerfile trong ./elaticsearch. Tôi gắn thẻ hình ảnh với tên "porter / elSTERearch" với tùy chọn "hình ảnh". Sau đó, tôi tham chiếu hình ảnh được xây dựng này trong định nghĩa dịch vụ "nút es" với tùy chọn "hình ảnh" và cũng sử dụng "phụ thuộc" để đảm bảo rằng "es-master" khác được tạo và chạy trước.


55
Các tùy chọn container_name:thực sự hữu ích.
Bruno Bieri

2
Bạn có chắc chắn điều này hoạt động? buildimageloại trừ lẫn nhau. Tôi nhận được "Dịch vụ xxx có cả hình ảnh và đường dẫn xây dựng được chỉ định. Một dịch vụ có thể được xây dựng để hình ảnh hoặc sử dụng hình ảnh hiện có, không phải cả hai."
Burhan Ali

3
Ồ, đừng bận tâm. Hai cái này có thể được sử dụng cùng nhau ở định dạng v2 trở đi. Thứ tôi đang thử nghiệm không chỉ định phiên bản nên tôi đoán được giả sử là v1.
Burhan Ali

3
Tùy chọn container_name: thực sự đã giúp tôi thks
lanni654321

2
@BrunoBieri depends_onsử dụng tên của dịch vụ trong doker-composetệp, không cần chỉ định tên container. Ngay cả ví dụ cho thấy nó depends_on: es-mastervà khôngdepends_on: es_master
blueFast 15/03/18

65

Theo docker-compose 1.6.0 :

Bây giờ bạn có thể chỉ định cả bản dựng và khóa hình ảnh nếu bạn đang sử dụng định dạng tệp mới. docker-compose buildsẽ xây dựng hình ảnh và gắn thẻ nó với tên bạn đã chỉ định, trong khi docker-compose pullsẽ cố gắng kéo nó.

Vì vậy, bạn docker-compose.ymlsẽ là

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

Để cập nhật docker-compose

sudo pip install -U docker-compose==1.6.0

1
LRI: Xác thực không thành công, lý do: cornsoup có cả hình ảnh và đường dẫn xây dựng được chỉ định. Một dịch vụ có thể được xây dựng để hình ảnh hoặc sử dụng một hình ảnh hiện có, không phải cả hai. (docker-compose 1.6.2)
zx1986

@ zx1986 vì bạn phải sử dụng phiên bản mới của tệp docker-compose.yml, hãy tham khảo docs.docker.com/compose/compose-file/#upgrad Dựa trên câu trả lời được cập nhật của tôi
arulraj.net

50

Tùy chọn 1: Gợi ý tên hình ảnh mặc định

Tên của hình ảnh được tạo bởi docker-compose tùy thuộc vào tên thư mục theo mặc định nhưng bạn có thể ghi đè lên nó bằng cách sử dụng --project-nameđối số:

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

Tùy chọn 2: Chỉ định tên hình ảnh

Khi docker-compose 1.6.0 không hoạt động, bạn có thể chỉ định build:image:có tên hình ảnh rõ ràng (xem câu trả lời của arulraj.net ).

Tùy chọn 3: Tạo hình ảnh từ container

Thứ ba là tạo một hình ảnh từ container:

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

1
--project-namedường như không được chấp nhận nữa. Sử dụng 1.23.2
Steven Vachon

21

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể sử dụng một hình ảnh đã được tạo và chỉ định tên của nó trong docker-compose.

Chúng tôi có một trường hợp sử dụng sản xuất trong đó máy chủ CI của chúng tôi xây dựng hình ảnh Docker có tên. ( docker build -t <specific_image_name> .). Khi hình ảnh được đặt tên được chỉ định, chúng tôi docker-composeluôn xây dựng hình ảnh cụ thể. Điều này cho phép một vài khả năng khác nhau:

1- Bạn có thể đảm bảo rằng bất cứ nơi nào bạn chạy docker-composetừ đó, bạn sẽ luôn được sử dụng phiên bản mới nhất của hình ảnh cụ thể đó.

2- Bạn có thể chỉ định nhiều hình ảnh được đặt tên trong docker-composetệp của mình và để chúng được tự động nối dây qua bước xây dựng trước đó.

Vì vậy, nếu hình ảnh của bạn đã được xây dựng, bạn có thể đặt tên cho hình ảnh docker-compose. Xóa buildvà chỉ địnhimage:

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

Sau khi bạn xây dựng hình ảnh của mình, hãy làm như sau:

docker tag <image id> mynewtag:version

sau đó bạn sẽ thấy hình ảnh của bạn không còn được đặt tên <none>khi bạn đi docker images.


3
Có thể chỉ định các thẻ với docker-compose?
Robert

các thẻ không được hỗ trợ tại thời điểm này.
GHETTO.CHILD 26/8/2015

1
Vì vậy, tôi phải xây dựng hình ảnh và sau đó gắn thẻ lại? Nó không thực sự hữu ích, tôi hy vọng docker-compose khắc phục vấn đề này một cách nhanh chóng?
Robert

1
nếu bạn đang xây dựng một môi trường nhiều container có. nếu bạn đang xây dựng một môi trường container duy nhất, bạn luôn có thể đidocker build -t mytag:version .
GHETTO.CHILD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.