Làm cách nào để đặt tên hình ảnh trong Dockerfile?


299

Bạn có thể đặt tên hình ảnh khi xây dựng một hình ảnh tùy chỉnh, như thế này:

docker build -t dude/man:v2 . # Will be named dude/man:v2

Có cách nào để xác định tên của hình ảnh trong Dockerfile, vì vậy tôi không phải đề cập đến nó trong docker buildlệnh?


1
Đối với bất kỳ ai tò mò, sử dụng TỪ ... Tên AS KHÔNG hoạt động
Rufus

Câu trả lời:


267

Gắn thẻ hình ảnh không được hỗ trợ bên trong Dockerfile. Điều này cần phải được thực hiện trong lệnh xây dựng của bạn. Như một giải pháp thay thế, bạn có thể thực hiện quá trình xây dựng với docker-compose.yml xác định tên hình ảnh đích và sau đó chạy a docker-compose build. Một mẫu docker-compose.yml sẽ trông giống như

version: '2'

services:
  man:
    build: .
    image: dude/man:v2

Điều đó nói rằng, có một sự thúc đẩy chống lại việc xây dựng với compose vì nó không hoạt động với các chế độ swarm. Vì vậy, bạn quay lại để chạy lệnh như bạn đã đưa ra trong câu hỏi của mình:

docker build -t dude/man:v2 .

Cá nhân, tôi có xu hướng xây dựng với một tập lệnh shell nhỏ trong thư mục của mình (build.sh) để vượt qua mọi đối số và bao gồm tên của hình ảnh ở đó để lưu gõ. Và để sản xuất, bản dựng được xử lý bởi một máy chủ ci / cd có tên hình ảnh bên trong tập lệnh đường ống.


303

Cách tạo hình ảnh với tên tùy chỉnh mà không cần sử dụng tệp yml:

docker build -t image_name .

Cách chạy một container với tên tùy chỉnh:

docker run -d --name container_name image_name

78
Tôi sẽ không bình luận gì thêm nhưng câu hỏi là "Làm cách nào để đặt tên hình ảnh trong Dockerfile?" Không phải "Làm thế nào để đặt tên hình ảnh docker?" Câu trả lời đó là trong chính câu hỏi.
Novaterata

68
Tôi đã quay lại vấn đề này một vài lần và câu trả lời này đã có ích, mặc dù không có chủ đề về mặt kỹ thuật
gdbj

7
Nếu bạn nhất quán nếu đặt Dockerfilethư mục có cùng tên như bạn muốn cho hình ảnh của mình, bạn có thể sử dụng docker build -t $(basename $PWD) .làm lệnh xây dựng. Sau đó, bạn có thể sử dụng tìm kiếm CTRL-R từ "build" để tìm và sử dụng lại lệnh và không bao giờ phải chỉnh sửa nó. Bạn cũng có thể làm cho nó một bí danh nếu bạn muốn.
Bruno Bronosky

Dù sao cũng cảm ơn bạn vì câu trả lời này. tôi đã dành vài giờ để có được điều này qua internet. Tôi không thể có được câu trả lời thích đáng, một người đặt tên cho hình ảnh của anh ta không thể đi xa hơn nếu không có tên này nếu anh ta cũng cần tên cho container của mình.
Susaj S Nair

38

Đây là một phiên bản khác nếu bạn phải tham khảo một tệp docker cụ thể:

version: "3"
services:
  nginx:
    container_name: nginx
    build:
      context: ../..
      dockerfile: ./docker/nginx/Dockerfile
    image: my_nginx:latest

Sau đó, bạn chỉ cần chạy

docker-compose build

1
Tôi thích rằng câu trả lời này cho thấy sự khác biệt giữa container_name và tên hình ảnh: tag. Nếu chỉ có thêm một chút giải thích về những gì đang diễn ra: "container_name" đặt tên cho container cuối cùng xuất hiện từ hình ảnh. "hình ảnh" tên và gắn thẻ hình ảnh được tạo, từ đó container được xây dựng. Như những người khác đã đề cập, người ta không thể chỉ định tên hình ảnh từ Dockerfile, như OP đã yêu cầu, vì vậy chúng tôi sử dụng tệp docker-compose.yml và chạy nó với "docker-compose up -d --build"
Sean McCarthy

-7

Bạn có thể thực hiện việc này bằng cách sử dụng 'AS' TỪ ubfox: 16.04 AS FooImage


6
Các AScú pháp quy định cụ thể tên mục tiêu sử dụng trong một đa giai đoạn xây dựng, và tên này cũng có thể được sử dụng thay cho một hình ảnh cho các COPY --fromcú pháp trong đó nhiều giai đoạn xây dựng. Tuy nhiên, nó không chỉ định tên / thẻ kết quả cho bản dựng.
BMitch
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.