Hướng dẫn exec not working python - thực thi không làm việc python

Khi tôi có exec () trong hàm xác định, nó không hoạt động ('nameerror: name' A 'không được xác định'):

Show
def abc():
    qwerty = "a = 2"
    exec(qwerty)
abc()
print(a)

Nhưng, khi tôi không sử dụng def, nó đang hoạt động:

qwerty = "a = 2"
exec(qwerty)
print(a)

Làm thế nào tôi có thể "sửa chữa" nó, hoặc có các giải pháp tương tự khác? (Tôi không thể thực hiện việc này khi bắt đầu, tôi cần gọi chức năng đó ở giữa chương trình)

Hỏi ngày 4 tháng 4 năm 2021 lúc 11:26Apr 4, 2021 at 11:26

5

Câu trả lời của tôi tương tự như câu trả lời của @Cyrill nhưng với một số khác biệt tinh tế. Có 3 cách để gọi hàm

qwerty = "a = 2"
exec(qwerty)
print(a)
32:
There are 3 ways to call the
qwerty = "a = 2"
exec(qwerty)
print(a)
32 function:

  1. Với 1 đối số, ví dụ:
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    33. Điều này sẽ thực thi câu lệnh trong phạm vi hiện tại và do đó tạo ra một biến cục bộ.
  2. với 2 đối số, ví dụ:
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    34. Điều này sẽ thực hiện tuyên bố trong không gian tên toàn cầu đã được Suplied, cũng là không gian tên toàn cầu hiện tại (được trả về bởi
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    35). Điều này sẽ thay đổi không gian tên toàn cầu.
  3. với 3 đối số, ví dụ:
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    36. Điều này sẽ thực hiện tuyên bố trong không gian tên địa phương đã được Suplation (đối số thứ ba) sử dụng không gian tên toàn cầu đã được đặt làm không gian tên toàn cầu. Điều này sẽ biến đổi không gian tên địa phương.

Bằng cách sử dụng cách thứ hai, chúng ta có thể thực thi mã trong không gian tên toàn cầu, vì vậy:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2

Đã trả lời ngày 4 tháng 4 năm 2021 lúc 11:55Apr 4, 2021 at 11:55

Hướng dẫn exec not working python - thực thi không làm việc python

Roy Cohenroy CohenRoy Cohen

1.5001 huy hiệu vàng4 Huy hiệu bạc21 Huy hiệu đồng1 gold badge4 silver badges21 bronze badges

Bạn đang thiếu một tham số trên hàm

qwerty = "a = 2"
exec(qwerty)
print(a)
37

không thể truy cập các biến được sử dụng bên trong hàm EXEC như thể chúng được khai báo trên toàn cầu

Một cách giải quyết sẽ là vượt qua 2 từ điển trong

qwerty = "a = 2"
exec(qwerty)
print(a)
37 như vậy, tôi thường sẽ làm điều đó như thế này ..
as such, i normally would do that like this..

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])

sau đó sẽ xuất ra

qwerty = "a = 2"
exec(qwerty)
print(a)
39

Đã trả lời ngày 4 tháng 4 năm 2021 lúc 11:42Apr 4, 2021 at 11:42

Hướng dẫn exec not working python - thực thi không làm việc python

RivenrivenRiven

3752 Huy hiệu bạc11 Huy hiệu đồng2 silver badges11 bronze badges

Docker có thể tự động xây dựng hình ảnh bằng cách đọc các hướng dẫn từ

qwerty = "a = 2"
exec(qwerty)
print(a)
40.
qwerty = "a = 2"
exec(qwerty)
print(a)
40 là một tài liệu văn bản chứa tất cả các lệnh mà người dùng có thể gọi trên dòng lệnh để lắp ráp hình ảnh. Trang này mô tả các lệnh bạn có thể sử dụng trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40.

Định dạng

Đây là định dạng của

qwerty = "a = 2"
exec(qwerty)
print(a)
40:

# Comment
INSTRUCTION arguments

Hướng dẫn không nhạy cảm trường hợp. Tuy nhiên, quy ước là để họ được viết tắt để phân biệt chúng với các đối số dễ dàng hơn.

Docker chạy hướng dẫn trong một

qwerty = "a = 2"
exec(qwerty)
print(a)
40 theo thứ tự. A
qwerty = "a = 2"
exec(qwerty)
print(a)
40 phải bắt đầu bằng lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
46. Điều này có thể là sau khi các chỉ thị phân tích cú pháp, bình luận và tranh luận toàn cầu. Hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
46 chỉ định hình ảnh mẹ mà bạn đang xây dựng.
qwerty = "a = 2"
exec(qwerty)
print(a)
46 chỉ có thể được đi trước bởi một hoặc nhiều hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
49, trong đó khai báo các đối số được sử dụng trong các dòng
qwerty = "a = 2"
exec(qwerty)
print(a)
46 trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40.must begin with a
qwerty = "a = 2"
exec(qwerty)
print(a)
46 instruction
. This may be after parser directives, comments, and globally scoped ARGs. The
qwerty = "a = 2"
exec(qwerty)
print(a)
46 instruction specifies the Parent Image from which you are building.
qwerty = "a = 2"
exec(qwerty)
print(a)
46 may only be preceded by one or more
qwerty = "a = 2"
exec(qwerty)
print(a)
49 instructions, which declare arguments that are used in
qwerty = "a = 2"
exec(qwerty)
print(a)
46 lines in the
qwerty = "a = 2"
exec(qwerty)
print(a)
40.

Docker coi các dòng bắt đầu bằng

qwerty = "a = 2"
exec(qwerty)
print(a)
52 như một nhận xét, trừ khi dòng là chỉ thị trình phân tích cú pháp hợp lệ. Một điểm đánh dấu
qwerty = "a = 2"
exec(qwerty)
print(a)
52 ở bất kỳ nơi nào khác trong một dòng được coi là một đối số. Điều này cho phép các câu như:

# Comment
RUN echo 'we are running some # of cool things'

Các dòng nhận xét được xóa trước khi các hướng dẫn Dockerfile được thực thi, điều đó có nghĩa là nhận xét trong ví dụ sau không được xử lý bởi shell thực thi lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
54 và cả hai ví dụ dưới đây đều tương đương:

RUN echo hello \
# comment
world

Các ký tự tiếp tục dòng không được hỗ trợ trong các bình luận.

Lưu ý về khoảng trắng

Để tương thích ngược, khoảng trắng hàng đầu trước khi nhận xét (

qwerty = "a = 2"
exec(qwerty)
print(a)
52) và các hướng dẫn (như
qwerty = "a = 2"
exec(qwerty)
print(a)
56) bị bỏ qua, nhưng không được khuyến khích. Khoảng trắng hàng đầu không được bảo quản trong những trường hợp này và do đó các ví dụ sau đây tương đương:

        # this is a comment-line
    RUN echo hello
RUN echo world

# this is a comment-line
RUN echo hello
RUN echo world

Tuy nhiên, lưu ý rằng khoảng trắng trong các đối số hướng dẫn, chẳng hạn như các lệnh sau

qwerty = "a = 2"
exec(qwerty)
print(a)
56, được bảo tồn, vì vậy các ví dụ sau đây in `hello world` với khoảng trắng hàng đầu theo quy định:

RUN echo "\
     hello\
     world"

Chỉ thị phân tích cú pháp

Các chỉ thị phân tích cú pháp là tùy chọn và ảnh hưởng đến cách xử lý các dòng tiếp theo trong

qwerty = "a = 2"
exec(qwerty)
print(a)
40 được xử lý. Chỉ thị phân tích cú pháp không thêm các lớp vào bản dựng và sẽ không được hiển thị dưới dạng bước xây dựng. Chỉ thị phân tích cú pháp được viết dưới dạng một loại bình luận đặc biệt trong mẫu
qwerty = "a = 2"
exec(qwerty)
print(a)
59. Một chỉ thị duy nhất chỉ có thể được sử dụng một lần.

Một khi một bình luận, hướng dẫn trống hoặc hướng dẫn xây dựng đã được xử lý, Docker không còn tìm kiếm các chỉ thị của trình phân tích cú pháp. Thay vào đó, nó coi bất cứ điều gì được định dạng như một chỉ thị phân tích cú pháp như một nhận xét và không cố gắng xác nhận nếu nó có thể là một chỉ thị phân tích cú pháp. Do đó, tất cả các chỉ thị của trình phân tích cú pháp phải đứng đầu

qwerty = "a = 2"
exec(qwerty)
print(a)
40.

Chỉ thị phân tích cú pháp không nhạy cảm trường hợp. Tuy nhiên, quy ước là để họ là chữ thường. Công ước cũng bao gồm một dòng trống theo bất kỳ chỉ thị phân tích cú pháp nào. Các ký tự tiếp tục dòng không được hỗ trợ trong các chỉ thị phân tích cú pháp.

Do các quy tắc này, các ví dụ sau đều không hợp lệ:

Không hợp lệ do tiếp tục dòng:

Không hợp lệ do xuất hiện hai lần:

qwerty = "a = 2"
exec(qwerty)
print(a)
0

Được coi là một nhận xét do xuất hiện sau một hướng dẫn xây dựng:

qwerty = "a = 2"
exec(qwerty)
print(a)
1

Được coi là một nhận xét do xuất hiện sau khi nhận xét không phải là chỉ thị phân tích cú pháp:

qwerty = "a = 2"
exec(qwerty)
print(a)
2

Chỉ thị chưa biết được coi là một nhận xét do không được công nhận. Ngoài ra, chỉ thị đã biết được coi là một nhận xét do xuất hiện sau khi nhận xét không phải là chỉ thị của trình phân tích cú pháp.

qwerty = "a = 2"
exec(qwerty)
print(a)
3

Whitespace không phá vỡ dòng được cho phép trong chỉ thị phân tích cú pháp. Do đó, các dòng sau đều được xử lý giống hệt nhau:

qwerty = "a = 2"
exec(qwerty)
print(a)
4

Các chỉ thị phân tích cú pháp sau đây được hỗ trợ:

  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    61
  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    62

Cú pháp

Tính năng này chỉ có sẵn khi sử dụng phụ trợ BuildKit và bị bỏ qua khi sử dụng phụ trợ xây dựng cổ điển.

Xem trang cú pháp tùy chỉnh Dockerfile để biết thêm thông tin.

thoát khỏi

Hoặc

Chỉ thị

qwerty = "a = 2"
exec(qwerty)
print(a)
62 đặt ký tự được sử dụng để thoát các ký tự trong một
qwerty = "a = 2"
exec(qwerty)
print(a)
40. Nếu không được chỉ định, ký tự thoát mặc định là
qwerty = "a = 2"
exec(qwerty)
print(a)
65.

Nhân vật Escape được sử dụng cả hai để thoát khỏi các ký tự trong một dòng và để thoát khỏi một dòng mới. Điều này cho phép một hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
40 để kéo dài nhiều dòng. Lưu ý rằng bất kể chỉ thị trình phân tích cú pháp
qwerty = "a = 2"
exec(qwerty)
print(a)
62 có được bao gồm trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40 hay không, việc thoát ra không được thực hiện trong lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
56, ngoại trừ ở cuối dòng.

Đặt ký tự thoát thành

qwerty = "a = 2"
exec(qwerty)
print(a)
70 đặc biệt hữu ích trên
qwerty = "a = 2"
exec(qwerty)
print(a)
71, trong đó
qwerty = "a = 2"
exec(qwerty)
print(a)
65 là bộ phân cách đường dẫn thư mục.
qwerty = "a = 2"
exec(qwerty)
print(a)
70 phù hợp với Windows PowerShell.

Hãy xem xét các ví dụ sau đây sẽ thất bại theo cách không rõ ràng trên

qwerty = "a = 2"
exec(qwerty)
print(a)
71.
qwerty = "a = 2"
exec(qwerty)
print(a)
65 thứ hai ở cuối dòng thứ hai sẽ được hiểu là một lối thoát cho dòng mới, thay vì mục tiêu thoát khỏi
qwerty = "a = 2"
exec(qwerty)
print(a)
65 đầu tiên. Tương tự,
qwerty = "a = 2"
exec(qwerty)
print(a)
65 ở cuối dòng thứ ba, giả sử nó thực sự được xử lý như một hướng dẫn, vì nó được coi là tiếp tục dòng. Kết quả của Dockerfile này là dòng thứ hai và thứ ba được coi là một hướng dẫn duy nhất:

qwerty = "a = 2"
exec(qwerty)
print(a)
5

Kết quả trong:

qwerty = "a = 2"
exec(qwerty)
print(a)
6

Một giải pháp cho những điều trên là sử dụng

qwerty = "a = 2"
exec(qwerty)
print(a)
78 làm mục tiêu của cả hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
79 và
qwerty = "a = 2"
exec(qwerty)
print(a)
80. Tuy nhiên, cú pháp này, tốt nhất là khó hiểu vì nó không phải là tự nhiên đối với các đường dẫn trên
qwerty = "a = 2"
exec(qwerty)
print(a)
71, và tệ nhất, lỗi dễ bị tất cả các lệnh trên
qwerty = "a = 2"
exec(qwerty)
print(a)
71 hỗ trợ
qwerty = "a = 2"
exec(qwerty)
print(a)
78 làm dấu phân cách đường dẫn.

Bằng cách thêm Chỉ thị trình phân tích cú pháp

qwerty = "a = 2"
exec(qwerty)
print(a)
62,
qwerty = "a = 2"
exec(qwerty)
print(a)
40 sau đây thành công như mong đợi với việc sử dụng ngữ nghĩa nền tảng tự nhiên cho các đường dẫn tệp trên
qwerty = "a = 2"
exec(qwerty)
print(a)
71:

qwerty = "a = 2"
exec(qwerty)
print(a)
7

Kết quả trong:

qwerty = "a = 2"
exec(qwerty)
print(a)
8

Một giải pháp cho những điều trên là sử dụng qwerty = "a = 2" exec(qwerty) print(a) 78 làm mục tiêu của cả hướng dẫn qwerty = "a = 2" exec(qwerty) print(a) 79 và qwerty = "a = 2" exec(qwerty) print(a) 80. Tuy nhiên, cú pháp này, tốt nhất là khó hiểu vì nó không phải là tự nhiên đối với các đường dẫn trên qwerty = "a = 2" exec(qwerty) print(a) 71, và tệ nhất, lỗi dễ bị tất cả các lệnh trên qwerty = "a = 2" exec(qwerty) print(a) 71 hỗ trợ qwerty = "a = 2" exec(qwerty) print(a) 78 làm dấu phân cách đường dẫn.

Bằng cách thêm Chỉ thị trình phân tích cú pháp

qwerty = "a = 2"
exec(qwerty)
print(a)
62,
qwerty = "a = 2"
exec(qwerty)
print(a)
40 sau đây thành công như mong đợi với việc sử dụng ngữ nghĩa nền tảng tự nhiên cho các đường dẫn tệp trên
qwerty = "a = 2"
exec(qwerty)
print(a)
71:

qwerty = "a = 2"
exec(qwerty)
print(a)
7

Thay thế môi trường

  • Các biến môi trường (được khai báo với câu lệnh
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    87) cũng có thể được sử dụng trong một số hướng dẫn nhất định là các biến được giải thích bởi
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    40. Escapes cũng được xử lý để bao gồm cú pháp giống như thay đổi vào một tuyên bố theo nghĩa đen.
  • Các biến môi trường được ghi nhận trong
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    40 với
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    90 hoặc
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    91. Chúng được xử lý tương đương và cú pháp Brace thường được sử dụng để giải quyết các vấn đề với các tên biến không có khoảng trắng, như
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    92.

Cú pháp

qwerty = "a = 2"
exec(qwerty)
print(a)
91 cũng hỗ trợ một vài bộ điều chỉnh
qwerty = "a = 2"
exec(qwerty)
print(a)
94 tiêu chuẩn như được chỉ định dưới đây:

qwerty = "a = 2"
exec(qwerty)
print(a)
95 chỉ ra rằng nếu
qwerty = "a = 2"
exec(qwerty)
print(a)
96 được đặt thì kết quả sẽ là giá trị đó. Nếu
qwerty = "a = 2"
exec(qwerty)
print(a)
96 không được đặt thì
qwerty = "a = 2"
exec(qwerty)
print(a)
98 sẽ là kết quả.

Ví dụ (biểu diễn phân tích cú pháp được hiển thị sau

qwerty = "a = 2"
exec(qwerty)
print(a)
52):

qwerty = "a = 2"
exec(qwerty)
print(a)
9

Các biến môi trường được hỗ trợ bởi danh sách các hướng dẫn sau đây trong

qwerty = "a = 2"
exec(qwerty)
print(a)
40:

  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    10
  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    79
  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    87
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    13
  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    15
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    16
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    17
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    18
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    19
  • def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    20 (khi kết hợp với một trong các hướng dẫn được hỗ trợ ở trên)

Thay thế biến môi trường sẽ sử dụng cùng một giá trị cho mỗi biến trong toàn bộ hướng dẫn. Nói cách khác, trong ví dụ này:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
0

sẽ dẫn đến

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
21 có giá trị
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
22, không phải
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
23. Tuy nhiên,
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
24 sẽ có giá trị
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
23 vì nó không phải là một phần của hướng dẫn tương tự đặt
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
26 thành
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
23.

.Dockerignore tệp

Trước khi Docker CLI gửi bối cảnh đến Docker Daemon, nó tìm kiếm một tệp có tên

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 trong thư mục gốc của bối cảnh. Nếu tệp này tồn tại, CLI sẽ sửa đổi ngữ cảnh để loại trừ các tệp và thư mục phù hợp với các mẫu trong đó. Điều này giúp tránh việc gửi các tệp và thư mục lớn hoặc nhạy cảm đến Daemon và có khả năng thêm chúng vào hình ảnh bằng cách sử dụng
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 hoặc
qwerty = "a = 2"
exec(qwerty)
print(a)
79.

CLI diễn giải tệp

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 dưới dạng danh sách các mẫu được phân tách bằng dòng mới tương tự như các tập tin của vỏ Unix. Đối với các mục đích phù hợp, gốc của bối cảnh được coi là cả thư mục làm việc và gốc. Ví dụ: các mẫu
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
32 và
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
33 đều loại trừ một tệp hoặc thư mục có tên
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
34 trong thư mục con
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
35 của
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
36 hoặc trong gốc của kho lưu trữ Git nằm ở
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
37. Không loại trừ bất cứ điều gì khác.

Nếu một dòng trong tệp

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 bắt đầu bằng
qwerty = "a = 2"
exec(qwerty)
print(a)
52 trong cột 1, thì dòng này được coi là một nhận xét và bị bỏ qua trước khi CLI diễn giải.

Dưới đây là một ví dụ

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 tệp:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
1

Tệp này gây ra hành vi xây dựng sau:

Qui địnhHành vi
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
41
Làm ngơ.
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
42
Loại trừ các tệp và thư mục có tên bắt đầu bằng
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
43 trong bất kỳ thư mục con ngay lập tức của gốc. Ví dụ: tệp đơn giản
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
44 bị loại trừ, cũng như thư mục
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
45.
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
46
Loại trừ các tập tin và thư mục bắt đầu bằng
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
43 từ bất kỳ thư mục con nào nằm dưới hai cấp dưới gốc. Ví dụ,
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
48 được loại trừ.
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
49
Loại trừ các tệp và thư mục trong thư mục gốc có tên là phần mở rộng một ký tự của
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
43. Ví dụ,
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
51 và
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
52 bị loại trừ.

Kết hợp được thực hiện bằng cách sử dụng quy tắc Go FilePath.Match. Một bước tiền xử lý loại bỏ khoảng trắng dẫn đầu và kéo dài và loại bỏ các yếu tố

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
53 và
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
54 bằng cách sử dụng Go Filepath.clean. Các dòng trống sau khi tiền xử lý bị bỏ qua.

Ngoài các quy tắc của FilePath.Match, Docker cũng hỗ trợ chuỗi ký tự đại diện đặc biệt

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
55 phù hợp với bất kỳ số lượng thư mục nào (bao gồm cả số không). Ví dụ,
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
56 sẽ loại trừ tất cả các tệp kết thúc bằng
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
57 được tìm thấy trong tất cả các thư mục, bao gồm cả gốc của bối cảnh xây dựng.

Các dòng bắt đầu bằng

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
58 (dấu chấm than) có thể được sử dụng để tạo ngoại lệ cho các loại trừ. Sau đây là một ví dụ
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 sử dụng cơ chế này:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
2

Tất cả các tệp Markdown ngoại trừ

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
60 được loại trừ khỏi ngữ cảnh.

Vị trí của các quy tắc ngoại lệ

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
58 ảnh hưởng đến hành vi: dòng cuối cùng của
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 phù hợp với một tệp cụ thể xác định xem nó được bao gồm hay loại trừ. Xem xét ví dụ sau:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
3

Không có tệp đánh dấu nào được bao gồm trong ngữ cảnh ngoại trừ các tệp readme khác với

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
63.

Bây giờ hãy xem xét ví dụ này:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
4

Tất cả các tệp readme được bao gồm. Dòng giữa không có hiệu lực vì

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
64 khớp với
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
63 và đến cuối cùng.

Bạn thậm chí có thể sử dụng tệp

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28 để loại trừ các tệp
qwerty = "a = 2"
exec(qwerty)
print(a)
40 và
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
28. Các tệp này vẫn được gửi đến Daemon vì nó cần chúng thực hiện công việc của mình. Nhưng hướng dẫn
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 và
qwerty = "a = 2"
exec(qwerty)
print(a)
79 không sao chép chúng vào hình ảnh.

Cuối cùng, bạn có thể muốn chỉ định các tệp nào sẽ bao gồm trong ngữ cảnh, thay vì loại trừ. Để đạt được điều này, chỉ định

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
71 là mẫu đầu tiên, theo sau là một hoặc nhiều mẫu ngoại lệ
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
58.

Ghi chú

Vì lý do lịch sử, mẫu

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
53 bị bỏ qua.

TỪ

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
5

Hoặc

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
6

Hoặc

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
7

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
46 khởi tạo giai đoạn xây dựng mới và đặt hình ảnh cơ sở cho các hướng dẫn tiếp theo. Như vậy,
qwerty = "a = 2"
exec(qwerty)
print(a)
40 hợp lệ phải bắt đầu với lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
46. Hình ảnh có thể là bất kỳ hình ảnh hợp lệ nào - thật dễ dàng để bắt đầu bằng cách kéo một hình ảnh từ các kho lưu trữ công cộng.pulling an image from the Public Repositories.

  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    49 là hướng dẫn duy nhất có thể đi trước
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 trong
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    40. Xem Hiểu cách Arg và từ Tương tác.
  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 có thể xuất hiện nhiều lần trong một
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    40 để tạo nhiều hình ảnh hoặc sử dụng một giai đoạn xây dựng làm phụ thuộc cho một giai đoạn khác. Chỉ cần ghi chú về đầu ra ID hình ảnh cuối cùng theo cam kết trước mỗi hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 mới. Mỗi hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 xóa bất kỳ trạng thái nào được tạo bởi các hướng dẫn trước đó.
  • Tùy chọn một tên có thể được đặt cho giai đoạn xây dựng mới bằng cách thêm
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    84 vào hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46. Tên có thể được sử dụng trong các hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 và
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    87 tiếp theo để tham khảo hình ảnh được xây dựng trong giai đoạn này.
  • Các giá trị
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    88 hoặc
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    89 là tùy chọn. Nếu bạn bỏ qua một trong hai, trình xây dựng giả định thẻ
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    90 theo mặc định. Người xây dựng trả về một lỗi nếu nó không thể tìm thấy giá trị
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    88.

Cờ

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
92 tùy chọn có thể được sử dụng để chỉ định nền tảng của hình ảnh trong trường hợp
qwerty = "a = 2"
exec(qwerty)
print(a)
46 tham chiếu hình ảnh đa nền tảng. Ví dụ:
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
94,
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
95 hoặc
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
96. Theo mặc định, nền tảng đích của yêu cầu xây dựng được sử dụng. Các đối số xây dựng toàn cầu có thể được sử dụng trong giá trị của cờ này, ví dụ ARG nền tảng tự động cho phép bạn buộc một giai đoạn lên nền tảng xây dựng gốc (
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
97) và sử dụng nó để kết hợp chéo vào nền tảng đích trong giai đoạn.

Hiểu làm thế nào arg và từ tương tác

qwerty = "a = 2"
exec(qwerty)
print(a)
46 Hướng dẫn hỗ trợ các biến được khai báo bởi bất kỳ hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
49 nào xảy ra trước lần đầu tiên
qwerty = "a = 2"
exec(qwerty)
print(a)
46.

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
8

Một

qwerty = "a = 2"
exec(qwerty)
print(a)
49 được tuyên bố trước
qwerty = "a = 2"
exec(qwerty)
print(a)
46 nằm ngoài giai đoạn xây dựng, vì vậy nó có thể được sử dụng trong bất kỳ hướng dẫn nào sau
qwerty = "a = 2"
exec(qwerty)
print(a)
46. Để sử dụng giá trị mặc định của
qwerty = "a = 2"
exec(qwerty)
print(a)
49 được khai báo trước khi
qwerty = "a = 2"
exec(qwerty)
print(a)
46 đầu tiên sử dụng lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
49 mà không có giá trị bên trong giai đoạn xây dựng:

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
9

CHẠY

Chạy có 2 hình thức:

  • loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    07 (biểu mẫu shell, lệnh được chạy trong shell, theo mặc định là
    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    08 trên Linux hoặc
    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    09 trên Windows)
  • loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    10 (Mẫu EXEC)

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
56 sẽ thực thi bất kỳ lệnh nào trong một lớp mới trên đầu hình ảnh hiện tại và cam kết kết quả. Hình ảnh đã cam kết kết quả sẽ được sử dụng cho bước tiếp theo trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40.

Layering

qwerty = "a = 2"
exec(qwerty)
print(a)
56 Hướng dẫn và tạo cam kết phù hợp với các khái niệm cốt lõi của Docker nơi các cam kết là giá rẻ và các container có thể được tạo ra từ bất kỳ điểm nào trong lịch sử hình ảnh, giống như kiểm soát nguồn.

Biểu mẫu EXEC cho phép tránh các lệnh shell chuỗi và các lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
56 bằng hình ảnh cơ sở không chứa shell được chỉ định có thể thực thi.

Shell mặc định cho biểu mẫu shell có thể được thay đổi bằng lệnh

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15.

Trong biểu mẫu Shell, bạn có thể sử dụng

qwerty = "a = 2"
exec(qwerty)
print(a)
65 (Backslash) để tiếp tục một hướng dẫn chạy duy nhất vào dòng tiếp theo. Ví dụ, hãy xem xét hai dòng sau:

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
0

Họ cùng nhau tương đương với dòng duy nhất này:

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
1

Để sử dụng một vỏ khác, khác với ‘/bin/sh, hãy sử dụng biểu mẫu EXEC trong vỏ mong muốn. Ví dụ:

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
2

Ghi chú

Mẫu EXEC được phân tích cú pháp như một mảng JSON, điều đó có nghĩa là bạn phải sử dụng các trích dẫn kép () xung quanh các từ không phải là tài liệu đơn ().

Không giống như biểu mẫu shell, biểu mẫu EXEC không gọi Shell Command Shell. Điều này có nghĩa là xử lý vỏ bình thường không xảy ra. Ví dụ,

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
17 sẽ không thay thế biến trên
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
18. Nếu bạn muốn xử lý shell thì hãy sử dụng biểu mẫu shell hoặc thực hiện trực tiếp shell, ví dụ:
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
19. Khi sử dụng biểu mẫu EXEC và thực hiện trực tiếp shell, như trong trường hợp cho biểu mẫu shell, đó là vỏ đang thực hiện mở rộng biến môi trường chứ không phải Docker.

Ghi chú

Mẫu EXEC được phân tích cú pháp như một mảng JSON, điều đó có nghĩa là bạn phải sử dụng các trích dẫn kép () xung quanh các từ không phải là tài liệu đơn ().

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
3

Không giống như biểu mẫu shell, biểu mẫu EXEC không gọi Shell Command Shell. Điều này có nghĩa là xử lý vỏ bình thường không xảy ra. Ví dụ,

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
17 sẽ không thay thế biến trên
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
18. Nếu bạn muốn xử lý shell thì hãy sử dụng biểu mẫu shell hoặc thực hiện trực tiếp shell, ví dụ:
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
19. Khi sử dụng biểu mẫu EXEC và thực hiện trực tiếp shell, như trong trường hợp cho biểu mẫu shell, đó là vỏ đang thực hiện mở rộng biến môi trường chứ không phải Docker.

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
4

Trong mẫu JSON, cần phải thoát khỏi sự chần chừ. Điều này đặc biệt có liên quan trên Windows trong đó dấu gạch chéo ngược là bộ phân cách đường dẫn. Dòng sau đây sẽ được coi là dạng vỏ do không phải là JSON hợp lệ và thất bại theo một cách bất ngờ:

Cú pháp chính xác cho ví dụ này là:

Bộ đệm cho các hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
56 không được vô hiệu hóa tự động trong lần xây dựng tiếp theo. Bộ đệm cho một hướng dẫn như
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
21 sẽ được sử dụng lại trong lần xây dựng tiếp theo. Bộ đệm cho các hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
56 có thể được vô hiệu hóa bằng cách sử dụng cờ
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
23, ví dụ
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
24.

Xem Hướng dẫn thực hành tốt nhất qwerty = "a = 2" exec(qwerty) print(a) 40 để biết thêm thông tin.

  • Bộ đệm cho các hướng dẫn

    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    56 có thể được vô hiệu hóa bằng hướng dẫn
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    10 và
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    79.

    Đối với các hệ thống có phiên bản AUFS gần đây (nghĩa là, tùy chọn gắn kết

    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    30 có thể được đặt), Docker sẽ cố gắng khắc phục sự cố tự động bằng cách gắn các lớp với tùy chọn
    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    30. Thông tin chi tiết về tùy chọn
    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    30 có thể được tìm thấy tại trang
    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    33 người đàn ông

    Nếu hệ thống của bạn không có hỗ trợ cho

    loc = {}
    def abc():
        qwerty = "a = 2"
        exec(qwerty, globals(), loc)
    abc()
    print(loc['a'])
    
    30, vấn đề này sẽ mô tả một cách giải quyết.

Chạy - -mount

Ghi chú

Được thêm vào trong

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
35

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
36 cho phép bạn tạo các giá treo quá trình chạy như một phần của bản dựng có thể truy cập. Điều này có thể được sử dụng để liên kết các tệp từ phần khác của bản dựng mà không cần sao chép, truy cập các bí mật xây dựng hoặc ổ cắm tác nhân SSH hoặc tạo các vị trí bộ đệm để tăng tốc độ xây dựng của bạn.

Cú pháp:

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
37

Gắn các loại

Loại hìnhSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
41
Cho phép container xây dựng truy cập các khóa SSH thông qua các đại lý SSH, với sự hỗ trợ cho các đường mật.

Chạy - -mount = type = liên kết

Loại gắn kết này cho phép các thư mục ràng buộc (chỉ đọc) trong ngữ cảnh hoặc trong một hình ảnh cho container xây dựng.

Quyền muaSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
41
Cho phép container xây dựng truy cập các khóa SSH thông qua các đại lý SSH, với sự hỗ trợ cho các đường mật.

Chạy - -mount = type = liên kết

Loại gắn kết này cho phép các thư mục ràng buộc (chỉ đọc) trong ngữ cảnh hoặc trong một hình ảnh cho container xây dựng.

Quyền muaSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
41
Cho phép container xây dựng truy cập các khóa SSH thông qua các đại lý SSH, với sự hỗ trợ cho các đường mật.
Chạy - -mount = type = liên kếtLoại gắn kết này cho phép các thư mục ràng buộc (chỉ đọc) trong ngữ cảnh hoặc trong một hình ảnh cho container xây dựng.

Quyền mua

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
421

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
5

Gắn dẫn đường.

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
6

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
43

Đường dẫn nguồn trong loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 44. Mặc định là gốc của loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 44.

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
44

Quyền muaSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.

loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 40

Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.

Quyền muaSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
41
Cho phép container xây dựng truy cập các khóa SSH thông qua các đại lý SSH, với sự hỗ trợ cho các đường mật.
Chạy - -mount = type = liên kếtLoại gắn kết này cho phép các thư mục ràng buộc (chỉ đọc) trong ngữ cảnh hoặc trong một hình ảnh cho container xây dựng.

Quyền mua

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
7

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
8

loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 421

Gắn dẫn đường.

Quyền muaSự mô tả
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
38 (mặc định)
Thư mục bối cảnh gắn kết (chỉ đọc).
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
39
Gắn một thư mục tạm thời vào thư mục bộ đệm cho trình biên dịch và người quản lý gói.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
40
Cho phép container xây dựng truy cập các tệp bảo mật như khóa riêng mà không cần nướng chúng vào hình ảnh.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
68
ID người dùng cho ổ cắm. Mặc định
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
69.
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
70
ID nhóm cho ổ cắm. Mặc định
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
69.

Ví dụ: Truy cập vào Gitlab

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
9

# Comment
INSTRUCTION arguments
0

Bạn cũng có thể chỉ định một đường dẫn đến tệp

# Comment
INSTRUCTION arguments
01 trực tiếp trên máy chủ thay vì
# Comment
INSTRUCTION arguments
02. Tuy nhiên, các tệp PEM với các đường mật không được hỗ trợ.

Chạy mạng

Ghi chú

Được thêm vào trong

# Comment
INSTRUCTION arguments
03

# Comment
INSTRUCTION arguments
04 cho phép kiểm soát môi trường mạng nào lệnh được chạy.

Cú pháp:

# Comment
INSTRUCTION arguments
05

Các loại mạng

Loại hìnhSự mô tả
# Comment
INSTRUCTION arguments
06 (mặc định)
Chạy trong mạng mặc định.
# Comment
INSTRUCTION arguments
07
Chạy mà không có quyền truy cập mạng.
# Comment
INSTRUCTION arguments
08
Chạy trong môi trường mạng máy chủ.

Chạy -mạng lưới = mặc định

Tương đương với việc hoàn toàn không cung cấp cờ, lệnh được chạy trong mạng mặc định cho bản dựng.

Chạy -mạng = không

Lệnh được chạy mà không có quyền truy cập mạng (vẫn còn

Ví dụ: cách ly các hiệu ứng bên ngoài

# Comment
INSTRUCTION arguments
1

# Comment
INSTRUCTION arguments
10 sẽ chỉ có thể cài đặt các gói được cung cấp trong Tarfile, có thể được kiểm soát bởi giai đoạn xây dựng trước đó.

Chạy -mạng = máy chủ

Lệnh được chạy trong môi trường mạng máy chủ (tương tự

Cảnh báo

Việc sử dụng

# Comment
INSTRUCTION arguments
12 được bảo vệ bởi quyền lợi
# Comment
INSTRUCTION arguments
13, cần được bật khi bắt đầu BuildKitd Daemon bằng cờ
# Comment
INSTRUCTION arguments
14 hoặc trong cấu hình buildkitd và cho yêu cầu xây dựng với cờ
# Comment
INSTRUCTION arguments
15.

Chạy -an toàn

Ghi chú

Được thêm vào trong

# Comment
INSTRUCTION arguments
03

# Comment INSTRUCTION arguments 04 cho phép kiểm soát môi trường mạng nào lệnh được chạy.

Cú pháp:

# Comment
INSTRUCTION arguments
05

Cảnh báo

Việc sử dụng

# Comment
INSTRUCTION arguments
12 được bảo vệ bởi quyền lợi
# Comment
INSTRUCTION arguments
13, cần được bật khi bắt đầu BuildKitd Daemon bằng cờ
# Comment
INSTRUCTION arguments
14 hoặc trong cấu hình buildkitd và cho yêu cầu xây dựng với cờ
# Comment
INSTRUCTION arguments
15.

Chạy -an toàn

# Comment
INSTRUCTION arguments
2

# Comment
INSTRUCTION arguments
3

Chưa có sẵn trong cú pháp ổn định, sử dụng phiên bản # Comment INSTRUCTION arguments 16.

Chạy - -security = không an toàn

Với # Comment INSTRUCTION arguments 17, Builder chạy lệnh không có hộp cát ở chế độ không an toàn, cho phép chạy các luồng yêu cầu các đặc quyền tăng cao (ví dụ: containerd). Điều này tương đương với việc chạy # Comment INSTRUCTION arguments 18.

Để truy cập tính năng này, quyền lợi

# Comment
INSTRUCTION arguments
19 sẽ được bật khi bắt đầu bản trình nền BuildKitd bằng cờ
# Comment
INSTRUCTION arguments
20 hoặc trong cấu hình buildkitd và đối với yêu cầu xây dựng với cờ
# Comment
INSTRUCTION arguments
21.

  • Ví dụ: Kiểm tra quyền lợi
  • Chạy - -security = hộp cát
  • Chế độ hộp cát mặc định có thể được kích hoạt thông qua
    # Comment
    INSTRUCTION arguments
    
    22, nhưng đó là không có op.

CMD

Hướng dẫn

# Comment
INSTRUCTION arguments
23 có ba biểu mẫu: These defaults can include an executable, or they can omit the executable, in which case you must specify an
# Comment
INSTRUCTION arguments
32 instruction as well.

# Comment
INSTRUCTION arguments
24 (Mẫu EXEC, đây là biểu mẫu ưa thích)

Ghi chú

Được thêm vào trong

# Comment
INSTRUCTION arguments
03

# Comment
INSTRUCTION arguments
04 cho phép kiểm soát môi trường mạng nào lệnh được chạy.

Cú pháp:

# Comment
INSTRUCTION arguments
05

Các loại mạng

# Comment
INSTRUCTION arguments
4

Loại hìnhrun your

# Comment
INSTRUCTION arguments
42 without a shell then you must express the command as a JSON array and give the full path to the executable. This array form is the preferred format of
# Comment
INSTRUCTION arguments
23.
Any additional parameters must be individually expressed as strings in the array:

# Comment
INSTRUCTION arguments
5

Sự mô tả

# Comment
INSTRUCTION arguments
06 (mặc định)

Ghi chú

Được thêm vào trong

# Comment
INSTRUCTION arguments
03

# Comment INSTRUCTION arguments 04 cho phép kiểm soát môi trường mạng nào lệnh được chạy.

# Comment
INSTRUCTION arguments
6

Cú pháp:

# Comment
INSTRUCTION arguments
05

# Comment
INSTRUCTION arguments
7

Một hình ảnh có thể có nhiều hơn một nhãn. Bạn có thể chỉ định nhiều nhãn trên một dòng. Trước Docker 1.10, điều này đã làm giảm kích thước của hình ảnh cuối cùng, nhưng điều này không còn xảy ra. Bạn vẫn có thể chọn chỉ định nhiều nhãn trong một hướng dẫn, theo một trong hai cách sau:

# Comment
INSTRUCTION arguments
8

# Comment
INSTRUCTION arguments
9

Ghi chú

Hãy chắc chắn sử dụng dấu ngoặc kép và không phải trích dẫn đơn. Đặc biệt khi bạn đang sử dụng phép nội suy chuỗi (ví dụ:

# Comment
INSTRUCTION arguments
57), các trích dẫn đơn sẽ lấy chuỗi như không bao gồm giá trị biến biến.

Các nhãn có trong hình ảnh cơ sở hoặc cha mẹ (hình ảnh trong dòng

qwerty = "a = 2"
exec(qwerty)
print(a)
46) được kế thừa bởi hình ảnh của bạn. Nếu một nhãn đã tồn tại nhưng với một giá trị khác, giá trị được ứng dụng rõ ràng nhất sẽ ghi đè bất kỳ giá trị đặt trước nào.

Để xem nhãn hình ảnh, hãy sử dụng lệnh

# Comment
INSTRUCTION arguments
59. Bạn có thể sử dụng tùy chọn
# Comment
INSTRUCTION arguments
60 để chỉ hiển thị các nhãn;

# Comment
RUN echo 'we are running some # of cool things'
0

# Comment
RUN echo 'we are running some # of cool things'
1

Người bảo trì (không dùng nữa)

Hướng dẫn

# Comment
INSTRUCTION arguments
61 đặt trường tác giả của các hình ảnh được tạo. Hướng dẫn
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
15 là phiên bản linh hoạt hơn nhiều và bạn nên sử dụng nó thay thế, vì nó cho phép cài đặt bất kỳ siêu dữ liệu nào bạn yêu cầu và có thể được xem dễ dàng, ví dụ với
# Comment
INSTRUCTION arguments
63. Để đặt nhãn tương ứng với trường
# Comment
INSTRUCTION arguments
61 bạn có thể sử dụng:

# Comment
RUN echo 'we are running some # of cool things'
2

Điều này sau đó sẽ được nhìn thấy từ

# Comment
INSTRUCTION arguments
63 với các nhãn khác.

PHƠI RA

# Comment
RUN echo 'we are running some # of cool things'
3

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
13 thông báo cho Docker rằng container lắng nghe các cổng mạng được chỉ định khi chạy. Bạn có thể chỉ định xem cổng lắng nghe trên TCP hoặc UDP và mặc định là TCP nếu giao thức không được chỉ định.

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
13 không thực sự xuất bản cổng. Nó có chức năng như một loại tài liệu giữa người xây dựng hình ảnh và người điều hành container, về những cổng nào được dự định sẽ được xuất bản. Để thực sự xuất bản cổng khi chạy container, hãy sử dụng cờ
# Comment
INSTRUCTION arguments
68 trên
# Comment
INSTRUCTION arguments
48 để xuất bản và ánh xạ một hoặc nhiều cổng hoặc cờ
# Comment
INSTRUCTION arguments
70 để xuất bản tất cả các cổng tiếp xúc và ánh xạ chúng lên các cổng bậc cao.

Theo mặc định,

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
13 giả định TCP. Bạn cũng có thể chỉ định UDP:

Để phơi bày trên cả TCP và UDP, bao gồm hai dòng:

# Comment
RUN echo 'we are running some # of cool things'
4

Trong trường hợp này, nếu bạn sử dụng

# Comment
INSTRUCTION arguments
70 với
# Comment
INSTRUCTION arguments
48, cổng sẽ được hiển thị một lần cho TCP và một lần cho UDP. Hãy nhớ rằng
# Comment
INSTRUCTION arguments
70 sử dụng cổng máy chủ có thứ tự cao phù du trên máy chủ, vì vậy cổng sẽ không giống nhau đối với TCP và UDP.

Bất kể cài đặt

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
13, bạn có thể ghi đè chúng vào thời gian chạy bằng cách sử dụng cờ
# Comment
INSTRUCTION arguments
68. Ví dụ

# Comment
RUN echo 'we are running some # of cool things'
5

Để thiết lập chuyển hướng cổng trên hệ thống máy chủ, hãy xem bằng cờ -P. Lệnh

# Comment
INSTRUCTION arguments
77 hỗ trợ tạo các mạng để liên lạc giữa các container mà không cần phải lộ hoặc xuất bản các cổng cụ thể, bởi vì các container được kết nối với mạng có thể liên lạc với nhau qua bất kỳ cổng nào. Để biết thông tin chi tiết, hãy xem tổng quan về tính năng này.

Env

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
87 đặt biến môi trường
# Comment
INSTRUCTION arguments
79 thành giá trị
# Comment
INSTRUCTION arguments
80. Giá trị này sẽ ở trong môi trường cho tất cả các hướng dẫn tiếp theo trong giai đoạn xây dựng và cũng có thể được thay thế nội tuyến trong nhiều hướng dẫn. Giá trị sẽ được giải thích cho các biến môi trường khác, vì vậy các ký tự trích dẫn sẽ bị xóa nếu chúng không bị thoát. Giống như phân tích cú pháp dòng lệnh, trích dẫn và dấu gạch chéo ngược có thể được sử dụng để bao gồm các khoảng trắng trong các giá trị.

Example:

# Comment
RUN echo 'we are running some # of cool things'
6

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
87 cho phép nhiều biến
# Comment
INSTRUCTION arguments
82 được đặt cùng một lúc và ví dụ dưới đây sẽ mang lại cùng một kết quả ròng trong hình ảnh cuối cùng:

# Comment
RUN echo 'we are running some # of cool things'
7

Các biến môi trường được đặt bằng cách sử dụng

qwerty = "a = 2"
exec(qwerty)
print(a)
87 sẽ tồn tại khi một thùng chứa được chạy từ hình ảnh kết quả. Bạn có thể xem các giá trị bằng cách sử dụng
# Comment
INSTRUCTION arguments
63 và thay đổi chúng bằng cách sử dụng
# Comment
INSTRUCTION arguments
85.

Môi trường tồn tại có thể gây ra các tác dụng phụ bất ngờ. Ví dụ: cài đặt

# Comment
INSTRUCTION arguments
86 thay đổi hành vi của
# Comment
INSTRUCTION arguments
87 và có thể gây nhầm lẫn cho người dùng hình ảnh của bạn.

Nếu một biến môi trường chỉ cần thiết trong quá trình xây dựng và không phải trong hình ảnh cuối cùng, hãy xem xét đặt giá trị cho một lệnh thay thế:

# Comment
RUN echo 'we are running some # of cool things'
8

Hoặc sử dụng

qwerty = "a = 2"
exec(qwerty)
print(a)
49, không tồn tại trong hình ảnh cuối cùng:

# Comment
RUN echo 'we are running some # of cool things'
9

Cú pháp thay thế

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
87 cũng cho phép một cú pháp thay thế
# Comment
INSTRUCTION arguments
90, bỏ qua
# Comment
INSTRUCTION arguments
91. Ví dụ:

Cú pháp này không cho phép nhiều varia môi trường được đặt trong một lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
87 và có thể gây nhầm lẫn. Ví dụ: sau đây đặt một biến môi trường duy nhất (
# Comment
INSTRUCTION arguments
93) với giá trị
# Comment
INSTRUCTION arguments
94:

Cú pháp thay thế được hỗ trợ cho khả năng tương thích ngược, nhưng không được khuyến khích vì những lý do được nêu ở trên và có thể bị xóa trong một bản phát hành trong tương lai.

CỘNG

Thêm có hai hình thức:

RUN echo hello \
# comment
world
0

Hình thức sau là cần thiết cho các đường dẫn chứa khoảng trắng.

Ghi chú

Tính năng

# Comment
INSTRUCTION arguments
95 chỉ được hỗ trợ trên Dockerfiles được sử dụng để xây dựng các thùng chứa Linux và sẽ không hoạt động trên các thùng chứa Windows. Vì các khái niệm sở hữu người dùng và nhóm không dịch giữa Linux và Windows, việc sử dụng
# Comment
INSTRUCTION arguments
96 và
# Comment
INSTRUCTION arguments
97 để dịch tên người dùng và nhóm sang IDS hạn chế tính năng này chỉ khả thi cho các thùng chứa dựa trên OS Linux.

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 sao chép các tệp, thư mục hoặc URL tệp từ xa mới từ
# Comment
INSTRUCTION arguments
99 và thêm chúng vào hệ thống tập tin của hình ảnh tại đường dẫn
# Comment
RUN echo 'we are running some # of cool things'
00.

Nhiều tài nguyên

# Comment
INSTRUCTION arguments
99 có thể được chỉ định nhưng nếu chúng là tệp hoặc thư mục, đường dẫn của chúng được hiểu là liên quan đến nguồn gốc của bối cảnh của bản dựng.

Mỗi

# Comment
INSTRUCTION arguments
99 có thể chứa các ký tự đại diện và kết hợp sẽ được thực hiện bằng cách sử dụng các quy tắc Go FilePath.Match. Ví dụ:

Để thêm tất cả các tệp bắt đầu bằng cách hom hom:

Trong ví dụ dưới đây,

# Comment
RUN echo 'we are running some # of cool things'
03 được thay thế bằng bất kỳ ký tự đơn nào, ví dụ: Home Home.txt.

# Comment
RUN echo 'we are running some # of cool things'
00 là một đường dẫn tuyệt đối hoặc đường dẫn so với
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
19, trong đó nguồn sẽ được sao chép bên trong thùng chứa đích.

Ví dụ dưới đây sử dụng đường dẫn tương đối và thêm Test Test.txt vào

# Comment
RUN echo 'we are running some # of cool things'
06:

RUN echo hello \
# comment
world
1

Trong khi ví dụ này sử dụng một đường dẫn tuyệt đối và thêm Test Test.txt vào

# Comment
RUN echo 'we are running some # of cool things'
07

RUN echo hello \
# comment
world
2

Khi thêm các tệp hoặc thư mục có chứa các ký tự đặc biệt (chẳng hạn như

# Comment
RUN echo 'we are running some # of cool things'
08 và
# Comment
RUN echo 'we are running some # of cool things'
09), bạn cần thoát khỏi các đường dẫn đó theo các quy tắc của Golang để ngăn chúng được coi là một mẫu phù hợp. Ví dụ: để thêm một tệp có tên
# Comment
RUN echo 'we are running some # of cool things'
10, sử dụng các tệp sau;

Tất cả các tệp và thư mục mới được tạo bằng UID và GID là 0, trừ khi cờ

# Comment
INSTRUCTION arguments
95 tùy chọn chỉ định một kết hợp tên người dùng, nhóm hoặc kết hợp UID/GID nhất định để yêu cầu quyền sở hữu cụ thể của nội dung được thêm vào. Định dạng của cờ
# Comment
INSTRUCTION arguments
95 cho phép các chuỗi tên người dùng và tên nhóm hoặc số nguyên trực tiếp UID và GID trong bất kỳ kết hợp nào. Cung cấp tên người dùng mà không có tên nhóm hoặc UID mà không có GID sẽ sử dụng UID số giống như GID. Nếu tên người dùng hoặc tên nhóm được cung cấp, hệ thống tập tin gốc của container
# Comment
INSTRUCTION arguments
96 và
# Comment
INSTRUCTION arguments
97 sẽ được sử dụng để thực hiện dịch từ tên sang số nguyên uid hoặc GID tương ứng. Các ví dụ sau đây cho thấy các định nghĩa hợp lệ cho cờ
# Comment
INSTRUCTION arguments
95:

RUN echo hello \
# comment
world
3

Nếu hệ thống tập tin gốc của container không chứa các tệp

# Comment
INSTRUCTION arguments
96 hoặc
# Comment
INSTRUCTION arguments
97 và tên người dùng hoặc nhóm được sử dụng trong cờ
# Comment
INSTRUCTION arguments
95, bản dựng sẽ không thành công trên hoạt động
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10. Sử dụng ID số không yêu cầu tra cứu và sẽ không phụ thuộc vào nội dung hệ thống tập tin gốc của container.

Trong trường hợp

# Comment
INSTRUCTION arguments
99 là URL tệp từ xa, đích sẽ có quyền 600. Nếu tệp từ xa được truy xuất có tiêu đề HTTP
# Comment
RUN echo 'we are running some # of cool things'
21, dấu thời gian từ tiêu đề đó sẽ được sử dụng để đặt
# Comment
RUN echo 'we are running some # of cool things'
22 trên tệp đích. Tuy nhiên, giống như bất kỳ tệp nào khác được xử lý trong
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10,
# Comment
RUN echo 'we are running some # of cool things'
22 sẽ không được đưa vào xác định liệu tệp có thay đổi hay không và nên cập nhật bộ đệm.

Ghi chú

Tính năng

# Comment
INSTRUCTION arguments
95 chỉ được hỗ trợ trên Dockerfiles được sử dụng để xây dựng các thùng chứa Linux và sẽ không hoạt động trên các thùng chứa Windows. Vì các khái niệm sở hữu người dùng và nhóm không dịch giữa Linux và Windows, việc sử dụng
# Comment
INSTRUCTION arguments
96 và
# Comment
INSTRUCTION arguments
97 để dịch tên người dùng và nhóm sang IDS hạn chế tính năng này chỉ khả thi cho các thùng chứa dựa trên OS Linux.

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 sao chép các tệp, thư mục hoặc URL tệp từ xa mới từ
# Comment
INSTRUCTION arguments
99 và thêm chúng vào hệ thống tập tin của hình ảnh tại đường dẫn
# Comment
RUN echo 'we are running some # of cool things'
00.

Ghi chú

Tính năng

# Comment
INSTRUCTION arguments
95 chỉ được hỗ trợ trên Dockerfiles được sử dụng để xây dựng các thùng chứa Linux và sẽ không hoạt động trên các thùng chứa Windows. Vì các khái niệm sở hữu người dùng và nhóm không dịch giữa Linux và Windows, việc sử dụng
# Comment
INSTRUCTION arguments
96 và
# Comment
INSTRUCTION arguments
97 để dịch tên người dùng và nhóm sang IDS hạn chế tính năng này chỉ khả thi cho các thùng chứa dựa trên OS Linux.

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 sao chép các tệp, thư mục hoặc URL tệp từ xa mới từ
# Comment
INSTRUCTION arguments
99 và thêm chúng vào hệ thống tập tin của hình ảnh tại đường dẫn
# Comment
RUN echo 'we are running some # of cool things'
00.

  • Nhiều tài nguyên

    # Comment
    INSTRUCTION arguments
    
    99 có thể được chỉ định nhưng nếu chúng là tệp hoặc thư mục, đường dẫn của chúng được hiểu là liên quan đến nguồn gốc của bối cảnh của bản dựng.

  • Mỗi

    # Comment
    INSTRUCTION arguments
    
    99 có thể chứa các ký tự đại diện và kết hợp sẽ được thực hiện bằng cách sử dụng các quy tắc Go FilePath.Match. Ví dụ:

  • Để thêm tất cả các tệp bắt đầu bằng cách hom hom:

  • Nếu

    # Comment
    INSTRUCTION arguments
    
    99 là một thư mục, toàn bộ nội dung của thư mục được sao chép, bao gồm cả siêu dữ liệu hệ thống tập tin.

Ghi chú

Bản thân thư mục không được sao chép, chỉ là nội dung của nó.

  • Nếu

    # Comment
    INSTRUCTION arguments
    
    99 là một kho lưu trữ tar cục bộ ở định dạng nén được công nhận (nhận dạng, gzip, bzip2 hoặc xz) thì nó được giải nén dưới dạng thư mục. Tài nguyên từ URL từ xa không được giải nén. Khi một thư mục được sao chép hoặc giải nén, nó có hành vi tương tự như
    # Comment
    RUN echo 'we are running some # of cool things'
    
    53, kết quả là sự kết hợp của:not decompressed. When a directory is copied or unpacked, it has the same behavior as
    # Comment
    RUN echo 'we are running some # of cool things'
    
    53, the result is the union of:

    1. Bất cứ điều gì tồn tại ở con đường đích và
    2. Nội dung của cây nguồn, với những xung đột được giải quyết có lợi cho Hồi 2. Trên cơ sở từng tập tin.

    Ghi chú

    Bản thân thư mục không được sao chép, chỉ là nội dung của nó.will not generate any kind of decompression error message, rather the file will simply be copied to the destination.

  • Nếu

    # Comment
    INSTRUCTION arguments
    
    99 là một kho lưu trữ tar cục bộ ở định dạng nén được công nhận (nhận dạng, gzip, bzip2 hoặc xz) thì nó được giải nén dưới dạng thư mục. Tài nguyên từ URL từ xa không được giải nén. Khi một thư mục được sao chép hoặc giải nén, nó có hành vi tương tự như
    # Comment
    RUN echo 'we are running some # of cool things'
    
    53, kết quả là sự kết hợp của:

  • Bất cứ điều gì tồn tại ở con đường đích và

  • Nội dung của cây nguồn, với những xung đột được giải quyết có lợi cho Hồi 2. Trên cơ sở từng tập tin.

  • Việc một tệp được xác định là định dạng nén được công nhận hay không được thực hiện chỉ dựa trên nội dung của tệp, chứ không phải tên của tệp. Ví dụ: nếu một tệp trống xảy ra kết thúc bằng

    # Comment
    RUN echo 'we are running some # of cool things'
    
    54 thì điều này sẽ không được công nhận là một tệp nén và sẽ không tạo bất kỳ loại thông báo lỗi giải nén nào, thay vào đó, tệp sẽ được sao chép đến đích.

Nếu # Comment INSTRUCTION arguments 99 là bất kỳ loại tệp nào khác, nó được sao chép riêng lẻ cùng với siêu dữ liệu của nó. Trong trường hợp này, nếu # Comment RUN echo 'we are running some # of cool things' 00 kết thúc bằng một dấu gạch chéo qwerty = "a = 2" exec(qwerty) print(a) 78, nó sẽ được coi là một thư mục và nội dung của # Comment INSTRUCTION arguments 99 sẽ được viết tại # Comment RUN echo 'we are running some # of cool things' 59.

Ghi chú

Nếu nhiều tài nguyên

# Comment
INSTRUCTION arguments
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì
# Comment
RUN echo 'we are running some # of cool things'
00 phải là một thư mục và nó phải kết thúc bằng dấu gạch chéo
qwerty = "a = 2"
exec(qwerty)
print(a)
78.

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không kết thúc bằng một dấu gạch chéo, nó sẽ được coi là một tệp thông thường và nội dung của
# Comment
INSTRUCTION arguments
99 sẽ được viết tại
# Comment
RUN echo 'we are running some # of cool things'
00.

RUN echo hello \
# comment
world
4

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không tồn tại, nó được tạo ra cùng với tất cả các thư mục bị thiếu trên đường dẫn của nó.

Xác minh tổng kiểm tra tệp từ xa # Comment RUN echo 'we are running some # of cool things' 67

Ghi chú

Nếu nhiều tài nguyên

# Comment
INSTRUCTION arguments
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì
# Comment
RUN echo 'we are running some # of cool things'
00 phải là một thư mục và nó phải kết thúc bằng dấu gạch chéo
qwerty = "a = 2"
exec(qwerty)
print(a)
78.

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không kết thúc bằng một dấu gạch chéo, nó sẽ được coi là một tệp thông thường và nội dung của
# Comment
INSTRUCTION arguments
99 sẽ được viết tại
# Comment
RUN echo 'we are running some # of cool things'
00.

RUN echo hello \
# comment
world
5

RUN echo hello \
# comment
world
6

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không tồn tại, nó được tạo ra cùng với tất cả các thư mục bị thiếu trên đường dẫn của nó.

Xác minh tổng kiểm tra tệp từ xa # Comment RUN echo 'we are running some # of cool things' 67

Có sẵn trong

# Comment
RUN echo 'we are running some # of cool things'
68. Sẽ được bao gồm trong
# Comment
RUN echo 'we are running some # of cool things'
69.

RUN echo hello \
# comment
world
7

Tổng kiểm tra của một tệp từ xa có thể được xác minh bằng cờ

# Comment
RUN echo 'we are running some # of cool things'
70:

RUN echo hello \
# comment
world
8

RUN echo hello \
# comment
world
9

Cờ # Comment RUN echo 'we are running some # of cool things' 70 chỉ hỗ trợ các nguồn HTTP hiện tại.

Thêm kho lưu trữ Git

# Comment
RUN echo 'we are running some # of cool things'
72

Biểu mẫu này cho phép thêm kho lưu trữ Git vào hình ảnh trực tiếp, mà không cần sử dụng lệnh # Comment RUN echo 'we are running some # of cool things' 75 bên trong hình ảnh:

Cờ

# Comment
RUN echo 'we are running some # of cool things'
76 thêm thư mục
# Comment
RUN echo 'we are running some # of cool things'
77. Cờ này mặc định là sai.

        # this is a comment-line
    RUN echo hello
RUN echo world
0

Thêm kho lưu trữ Git riêng

Ghi chú

Để thêm repo riêng qua SSH, hãy tạo một Dockerfile với biểu mẫu sau:

Dockerfile này có thể được xây dựng với

# Comment
RUN echo 'we are running some # of cool things'
78 hoặc
# Comment
RUN echo 'we are running some # of cool things'
79, ví dụ:

Thêm liên kết

Xem

# Comment
RUN echo 'we are running some # of cool things'
80.

Sao chép

Bản sao có hai biểu mẫu:

Hình thức sau này được yêu cầu cho các đường dẫn có chứa khoảng trắng

Tính năng

# Comment
INSTRUCTION arguments
95 chỉ được hỗ trợ trên Dockerfiles được sử dụng để xây dựng các thùng chứa Linux và sẽ không hoạt động trên các thùng chứa Windows. Vì các khái niệm sở hữu người dùng và nhóm không dịch giữa Linux và Windows, việc sử dụng
# Comment
INSTRUCTION arguments
96 và
# Comment
INSTRUCTION arguments
97 để dịch tên người dùng và nhóm sang IDS hạn chế tính năng này chỉ khả thi cho các thùng chứa dựa trên OS Linux.

        # this is a comment-line
    RUN echo hello
RUN echo world
1

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
79 sao chép các tệp hoặc thư mục mới từ
# Comment
INSTRUCTION arguments
99 và thêm chúng vào hệ thống tập tin của container tại đường dẫn
# Comment
RUN echo 'we are running some # of cool things'
00.

        # this is a comment-line
    RUN echo hello
RUN echo world
2

Nhiều tài nguyên

# Comment
INSTRUCTION arguments
99 có thể được chỉ định nhưng các đường dẫn của các tệp và thư mục sẽ được hiểu là liên quan đến nguồn gốc của bối cảnh của bản dựng.

        # this is a comment-line
    RUN echo hello
RUN echo world
3

Mỗi

# Comment
INSTRUCTION arguments
99 có thể chứa các ký tự đại diện và kết hợp sẽ được thực hiện bằng cách sử dụng các quy tắc Go FilePath.Match. Ví dụ:

        # this is a comment-line
    RUN echo hello
RUN echo world
4

Nếu hệ thống tập tin gốc của container không chứa các tệp

# Comment
INSTRUCTION arguments
96 hoặc
# Comment
INSTRUCTION arguments
97 và tên người dùng hoặc nhóm được sử dụng trong cờ
# Comment
INSTRUCTION arguments
95, bản dựng sẽ không thành công trên hoạt động
qwerty = "a = 2"
exec(qwerty)
print(a)
79. Sử dụng ID số không yêu cầu tra cứu và không phụ thuộc vào nội dung hệ thống tập tin gốc của container.

Ghi chú

Nếu bạn xây dựng bằng cách sử dụng stdin (

RUN echo hello \
# comment
world
06), không có ngữ cảnh xây dựng, do đó,
qwerty = "a = 2"
exec(qwerty)
print(a)
79 có thể được sử dụng.

Tùy chọn

qwerty = "a = 2"
exec(qwerty)
print(a)
79 chấp nhận cờ
RUN echo hello \
# comment
world
09 có thể được sử dụng để đặt vị trí nguồn thành giai đoạn xây dựng trước đó (được tạo bằng
RUN echo hello \
# comment
world
10) sẽ được sử dụng thay vì bối cảnh xây dựng được gửi bởi người dùng. Trong trường hợp một giai đoạn xây dựng với một tên được chỉ định, có thể tìm thấy một hình ảnh có cùng tên được cố gắng sử dụng thay thế.

qwerty = "a = 2"
exec(qwerty)
print(a)
79 tuân theo các quy tắc sau:

  • Đường dẫn

    # Comment
    INSTRUCTION arguments
    
    99 phải nằm trong bối cảnh của bản dựng; Bạn không thể
    RUN echo hello \
    # comment
    world
    
    13, bởi vì bước đầu tiên của
    # Comment
    RUN echo 'we are running some # of cool things'
    
    41 là gửi thư mục ngữ cảnh (và thư mục con) đến docker daemon.

  • Nếu

    # Comment
    INSTRUCTION arguments
    
    99 là một thư mục, toàn bộ nội dung của thư mục được sao chép, bao gồm cả siêu dữ liệu hệ thống tập tin.

Ghi chú

Nếu bạn xây dựng bằng cách sử dụng stdin (

RUN echo hello \
# comment
world
06), không có ngữ cảnh xây dựng, do đó,
qwerty = "a = 2"
exec(qwerty)
print(a)
79 có thể được sử dụng.

  • Tùy chọn

    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    79 chấp nhận cờ
    RUN echo hello \
    # comment
    world
    
    09 có thể được sử dụng để đặt vị trí nguồn thành giai đoạn xây dựng trước đó (được tạo bằng
    RUN echo hello \
    # comment
    world
    
    10) sẽ được sử dụng thay vì bối cảnh xây dựng được gửi bởi người dùng. Trong trường hợp một giai đoạn xây dựng với một tên được chỉ định, có thể tìm thấy một hình ảnh có cùng tên được cố gắng sử dụng thay thế.

  • qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    79 tuân theo các quy tắc sau:

  • Đường dẫn

    # Comment
    INSTRUCTION arguments
    
    99 phải nằm trong bối cảnh của bản dựng; Bạn không thể
    RUN echo hello \
    # comment
    world
    
    13, bởi vì bước đầu tiên của
    # Comment
    RUN echo 'we are running some # of cool things'
    
    41 là gửi thư mục ngữ cảnh (và thư mục con) đến docker daemon.

  • Nếu

    # Comment
    INSTRUCTION arguments
    
    99 là một thư mục, toàn bộ nội dung của thư mục được sao chép, bao gồm cả siêu dữ liệu hệ thống tập tin.

Ghi chú

Bản thân thư mục không được sao chép, chỉ là nội dung của nó.

Nếu # Comment INSTRUCTION arguments 99 là bất kỳ loại tệp nào khác, nó được sao chép riêng lẻ cùng với siêu dữ liệu của nó. Trong trường hợp này, nếu # Comment RUN echo 'we are running some # of cool things' 00 kết thúc bằng một dấu gạch chéo qwerty = "a = 2" exec(qwerty) print(a) 78, nó sẽ được coi là một thư mục và nội dung của # Comment INSTRUCTION arguments 99 sẽ được viết tại # Comment RUN echo 'we are running some # of cool things' 59.

Ghi chú

Nếu nhiều tài nguyên

# Comment
INSTRUCTION arguments
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì
# Comment
RUN echo 'we are running some # of cool things'
00 phải là một thư mục và nó phải kết thúc bằng dấu gạch chéo
qwerty = "a = 2"
exec(qwerty)
print(a)
78.

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không kết thúc bằng một dấu gạch chéo, nó sẽ được coi là một tệp thông thường và nội dung của
# Comment
INSTRUCTION arguments
99 sẽ được viết tại
# Comment
RUN echo 'we are running some # of cool things'
00.

Nếu

# Comment
RUN echo 'we are running some # of cool things'
00 không tồn tại, nó được tạo ra cùng với tất cả các thư mục bị thiếu trên đường dẫn của nó.

        # this is a comment-line
    RUN echo hello
RUN echo world
5

Hướng dẫn đầu tiên gặp phải

qwerty = "a = 2"
exec(qwerty)
print(a)
79 sẽ vô hiệu hóa bộ đệm cho tất cả các hướng dẫn sau từ Dockerfile nếu nội dung của
# Comment
INSTRUCTION arguments
99 đã thay đổi. Điều này bao gồm vô hiệu hóa bộ đệm cho các hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
56. Xem Hướng dẫn thực tiễn tốt nhất
qwerty = "a = 2"
exec(qwerty)
print(a)
40 - Tận dụng bộ đệm xây dựng để biết thêm thông tin.

Sao chép đường dẫn

        # this is a comment-line
    RUN echo hello
RUN echo world
6

Được thêm vào trong

RUN echo hello \
# comment
world
32

Kích hoạt cờ này trong các lệnh qwerty = "a = 2" exec(qwerty) print(a) 79 hoặc def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2 10 cho phép bạn sao chép các tệp với ngữ nghĩa nâng cao nơi các tệp của bạn vẫn độc lập trên lớp của chúng và don không bị vô hiệu khi các lệnh trên các lớp trước đó được thay đổi.

Khi

RUN echo hello \
# comment
world
35 được sử dụng các tệp nguồn của bạn được sao chép vào thư mục đích trống. Thư mục đó được biến thành một lớp được liên kết trên trạng thái trước đó của bạn.

Tương đương với việc thực hiện hai bản dựng:

và hợp nhất tất cả các lớp của cả hai hình ảnh với nhau.

Lợi ích của việc sử dụng

RUN echo hello \
# comment
world
35

Nhập cảnh

EntryPoint có hai biểu mẫu:

Mẫu EXEC, là dạng ưa thích:

        # this is a comment-line
    RUN echo hello
RUN echo world
7

Mẫu vỏ:

        # this is a comment-line
    RUN echo hello
RUN echo world
8

# Comment
INSTRUCTION arguments
32 cho phép bạn định cấu hình một container sẽ chạy như một thực thi.

Ví dụ: sau đây bắt đầu nginx với nội dung mặc định của nó, nghe trên cổng 80:

        # this is a comment-line
    RUN echo hello
RUN echo world
9

Các đối số dòng lệnh đến

RUN echo hello \
# comment
world
51 sẽ được thêm vào sau tất cả các phần tử trong Mẫu EXEC
# Comment
INSTRUCTION arguments
32 và sẽ ghi đè tất cả các yếu tố được chỉ định bằng
# Comment
INSTRUCTION arguments
23. Điều này cho phép các đối số được chuyển đến điểm nhập cảnh, tức là,
RUN echo hello \
# comment
world
54 sẽ chuyển đối số
RUN echo hello \
# comment
world
55 đến điểm nhập. Bạn có thể ghi đè lệnh
# Comment
INSTRUCTION arguments
32 bằng cờ
RUN echo hello \
# comment
world
57.

Biểu mẫu Shell ngăn chặn mọi đối số dòng lệnh

# Comment
INSTRUCTION arguments
23 hoặc
RUN echo hello \
# comment
world
59 không được sử dụng, nhưng có nhược điểm là
# Comment
INSTRUCTION arguments
32 của bạn sẽ được bắt đầu dưới dạng phụ của
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
08, không truyền tín hiệu. Điều này có nghĩa là thực thi sẽ không phải là container từ ____ ____662 - và sẽ không nhận được tín hiệu UNIX - vì vậy thực thi của bạn sẽ không nhận được
RUN echo hello \
# comment
world
63 từ
RUN echo hello \
# comment
world
64.

Chỉ hướng dẫn

# Comment
INSTRUCTION arguments
32 cuối cùng trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40 sẽ có hiệu lực.

Exec Form EntryPoint Ví dụ

Bạn có thể sử dụng dạng EXEC của

# Comment
INSTRUCTION arguments
32 để đặt các lệnh và đối số mặc định khá ổn định và sau đó sử dụng một trong hai dạng
# Comment
INSTRUCTION arguments
23 để đặt các mặc định bổ sung có nhiều khả năng thay đổi.

# this is a comment-line
RUN echo hello
RUN echo world
0

Khi bạn chạy container, bạn có thể thấy rằng

RUN echo hello \
# comment
world
69 là quá trình duy nhất:

# this is a comment-line
RUN echo hello
RUN echo world
1

Để kiểm tra kết quả hơn nữa, bạn có thể sử dụng

RUN echo hello \
# comment
world
70:

# this is a comment-line
RUN echo hello
RUN echo world
2

Và bạn có thể yêu cầu một cách duyên dáng

RUN echo hello \
# comment
world
69 để tắt bằng cách sử dụng
RUN echo hello \
# comment
world
72.

Các

qwerty = "a = 2"
exec(qwerty)
print(a)
40 sau đây hiển thị bằng cách sử dụng
# Comment
INSTRUCTION arguments
32 để chạy Apache ở phía trước (tức là, như
RUN echo hello \
# comment
world
62):

# this is a comment-line
RUN echo hello
RUN echo world
3

Nếu bạn cần viết tập lệnh khởi động cho một thực thi duy nhất, bạn có thể đảm bảo rằng thực thi cuối cùng sẽ nhận được tín hiệu UNIX bằng cách sử dụng các lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
32 và
RUN echo hello \
# comment
world
77:

# this is a comment-line
RUN echo hello
RUN echo world
4

Cuối cùng, nếu bạn cần phải làm thêm thêm (hoặc giao tiếp với các thùng chứa khác) khi tắt máy hoặc đang phối hợp nhiều hơn một thực thi, bạn có thể cần đảm bảo rằng tập lệnh

# Comment
INSTRUCTION arguments
32 nhận được tín hiệu Unix, truyền chúng Có một số hoạt động khác:

# this is a comment-line
RUN echo hello
RUN echo world
5

Nếu bạn chạy hình ảnh này với

RUN echo hello \
# comment
world
79, thì bạn có thể kiểm tra các quy trình của container với
RUN echo hello \
# comment
world
70 hoặc
RUN echo hello \
# comment
world
81, sau đó yêu cầu tập lệnh dừng Apache:

# this is a comment-line
RUN echo hello
RUN echo world
6

Ghi chú

Bạn có thể ghi đè cài đặt

# Comment
INSTRUCTION arguments
32 bằng cách sử dụng
RUN echo hello \
# comment
world
83, nhưng điều này chỉ có thể đặt nhị phân thành EXEC (sẽ không sử dụng
RUN echo hello \
# comment
world
84).

Ghi chú

Bạn có thể ghi đè cài đặt

# Comment
INSTRUCTION arguments
32 bằng cách sử dụng
RUN echo hello \
# comment
world
83, nhưng điều này chỉ có thể đặt nhị phân thành EXEC (sẽ không sử dụng
RUN echo hello \
# comment
world
84).

Mẫu EXEC được phân tích cú pháp như một mảng JSON, điều đó có nghĩa là bạn phải sử dụng các trích dẫn kép () xung quanh các từ không phải là tài liệu đơn ().

Không giống như biểu mẫu shell, biểu mẫu EXEC không gọi Shell Command Shell. Điều này có nghĩa là xử lý vỏ bình thường không xảy ra. Ví dụ, RUN echo hello \ # comment world 85 sẽ không thay thế thay đổi trên loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 18. Nếu bạn muốn xử lý shell thì hãy sử dụng biểu mẫu shell hoặc thực hiện trực tiếp shell, ví dụ: RUN echo hello \ # comment world 87. Khi sử dụng biểu mẫu EXEC và thực hiện trực tiếp shell, như trong trường hợp cho biểu mẫu shell, đó là vỏ đang thực hiện mở rộng biến môi trường chứ không phải Docker.

Ví dụ về biểu mẫu shell

# this is a comment-line
RUN echo hello
RUN echo world
7

Bạn có thể chỉ định một chuỗi đơn giản cho

# Comment
INSTRUCTION arguments
32 và nó sẽ thực thi trong
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
08. Hình thức này sẽ sử dụng xử lý vỏ để thay thế các biến môi trường vỏ và sẽ bỏ qua bất kỳ đối số dòng lệnh
# Comment
INSTRUCTION arguments
23 hoặc
# Comment
INSTRUCTION arguments
48. Để đảm bảo rằng
RUN echo hello \
# comment
world
92 sẽ báo hiệu bất kỳ hoạt động dài nào
# Comment
INSTRUCTION arguments
32 có thể thực thi chính xác, bạn cần nhớ để bắt đầu với
qwerty = "a = 2"
exec(qwerty)
print(a)
32:

# this is a comment-line
RUN echo hello
RUN echo world
8

Khi bạn chạy hình ảnh này, bạn sẽ thấy quy trình

RUN echo hello \
# comment
world
62 duy nhất:

# this is a comment-line
RUN echo hello
RUN echo world
9

Thoát khỏi sạch sẽ trên

RUN echo hello \
# comment
world
92:

RUN echo "\
     hello\
     world"
0

Nếu bạn quên thêm

qwerty = "a = 2"
exec(qwerty)
print(a)
32 vào đầu
# Comment
INSTRUCTION arguments
32 của bạn:

RUN echo "\
     hello\
     world"
1

Sau đó, bạn có thể chạy nó (đặt tên cho bước tiếp theo):

Bạn có thể thấy từ đầu ra của

RUN echo hello \
# comment
world
69 rằng
# Comment
INSTRUCTION arguments
32 được chỉ định không phải là
RUN echo hello \
# comment
world
62.

RUN echo "\
     hello\
     world"
2

Nếu sau đó bạn chạy RUN echo hello \ # comment world 72, container sẽ không thoát rõ ràng - lệnh # this is a comment-line RUN echo hello RUN echo world 03 sẽ bị buộc phải gửi # this is a comment-line RUN echo hello RUN echo world 04 sau thời gian chờ:

Hiểu cách CMD và EntryPoint tương tác

  1. Cả hướng dẫn

    # Comment
    INSTRUCTION arguments
    
    23 và
    # Comment
    INSTRUCTION arguments
    
    32 xác định lệnh nào được thực thi khi chạy một thùng chứa. Có một vài quy tắc mô tả sự hợp tác của họ.

  2. Dockerfile nên chỉ định ít nhất một trong các lệnh

    # Comment
    INSTRUCTION arguments
    
    23 hoặc
    # Comment
    INSTRUCTION arguments
    
    32.

  3. # Comment
    INSTRUCTION arguments
    
    32 nên được xác định khi sử dụng container làm thực thi.

  4. # Comment
    INSTRUCTION arguments
    
    23 sẽ được ghi đè khi chạy bộ chứa với các đối số thay thế.

Bảng dưới đây cho thấy lệnh nào được thực thi cho các kết hợp

# Comment
INSTRUCTION arguments
32 /
# Comment
INSTRUCTION arguments
23 khác nhau:

 Không có điểm nhập cảnhEntryPoint EXEC_ENTRY P1_ENTRYEntryPoint [exec Exec_entry ,, P1_Entry,]
Không có CMD Lỗi, không được phép/bin/sh -c exec_entry p1_entryEXEC_ENTRY P1_ENTRY
CMD [exec exec_cmd ,, p1_cmd,] EXEC_CMD P1_CMD/bin/sh -c exec_entry p1_entryEXEC_ENTRY P1_ENTRY
CMD [exec exec_cmd ,, p1_cmd,] EXEC_CMD P1_CMD/bin/sh -c exec_entry p1_entryEXEC_ENTRY P1_ENTRY

CMD [exec exec_cmd ,, p1_cmd,]

EXEC_CMD P1_CMD

EXEC_ENTRY P1_ENTRY EXEC_CMD P1_CMD

CMD EXEC_CMD P1_CMD

/bin/sh -c exec_cmd p1_cmd

RUN echo "\
     hello\
     world"
3

EXEC_ENTRY P1_ENTRY /BIN /SH -C EXEC_CMD P1_CMD

Ghi chú

Nếu

# Comment
INSTRUCTION arguments
23 được xác định từ hình ảnh cơ sở, cài đặt
# Comment
INSTRUCTION arguments
32 sẽ đặt lại
# Comment
INSTRUCTION arguments
23 thành một giá trị trống. Trong kịch bản này,
# Comment
INSTRUCTION arguments
23 phải được xác định trong hình ảnh hiện tại để có giá trị.

  • ÂM LƯỢNG: When using Windows-based containers, the destination of a volume inside the container must be one of:

    • Hướng dẫn
      def abc():
          qwerty = 'a = 2'
          exec(qwerty, globals())
      abc()
      print(a)  # outputs 2
      
      18 tạo ra một điểm gắn kết với tên được chỉ định và đánh dấu nó là giữ các khối lượng được gắn bên ngoài từ máy chủ gốc hoặc các thùng chứa khác. Giá trị có thể là một mảng JSON,
              # this is a comment-line
          RUN echo hello
      RUN echo world
      
      20 hoặc một chuỗi đơn giản có nhiều đối số, chẳng hạn như
              # this is a comment-line
          RUN echo hello
      RUN echo world
      
      21 hoặc
              # this is a comment-line
          RUN echo hello
      RUN echo world
      
      22. Để biết thêm thông tin/ví dụ và hướng dẫn lắp thông qua ứng dụng khách Docker, hãy tham khảo thư mục chia sẻ thông qua tài liệu tập.
    • Lệnh
      # Comment
      INSTRUCTION arguments
      
      48 khởi tạo âm lượng mới được tạo với bất kỳ dữ liệu nào tồn tại tại vị trí được chỉ định trong hình ảnh cơ sở. Ví dụ, hãy xem xét đoạn trích dockerfile sau:
  • Dockerfile này dẫn đến một hình ảnh khiến

    # Comment
    INSTRUCTION arguments
    
    48 tạo ra một điểm gắn kết mới tại
            # this is a comment-line
        RUN echo hello
    RUN echo world
    
    25 và sao chép tệp
            # this is a comment-line
        RUN echo hello
    RUN echo world
    
    26 vào tập mới được tạo.
    : If any build steps change the data within the volume after it has been declared, those changes will be discarded.

  • Ghi chú về chỉ định khối lượng: The list is parsed as a JSON array. You must enclose words with double quotes (

            # this is a comment-line
        RUN echo hello
    RUN echo world
    
    29) rather than single quotes (
            # this is a comment-line
        RUN echo hello
    RUN echo world
    
    30).

  • Hãy ghi nhớ những điều sau đây về khối lượng trong

    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    40.: The host directory (the mountpoint) is, by its nature, host-dependent. This is to preserve image portability, since a given host directory can’t be guaranteed to be available on all hosts. For this reason, you can’t mount a host directory from within the Dockerfile. The
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    18 instruction does not support specifying a
            # this is a comment-line
        RUN echo hello
    RUN echo world
    
    32 parameter. You must specify the mountpoint when you create or run the container.

Khối lượng trên các thùng chứa dựa trên Windows: Khi sử dụng các thùng chứa dựa trên Windows, đích của một âm lượng bên trong bộ chứa phải là một trong số:

một thư mục không tồn tại hoặc trống

một ổ đĩa khác với

        # this is a comment-line
    RUN echo hello
RUN echo world
28

Thay đổi khối lượng từ bên trong Dockerfile: Nếu bất kỳ bước xây dựng nào thay đổi dữ liệu trong khối lượng sau khi được khai báo, những thay đổi đó sẽ bị loại bỏ.

Định dạng JSON: Danh sách được phân tích cú pháp như một mảng JSON. Bạn phải gửi kèm các từ có trích dẫn kép (

        # this is a comment-line
    RUN echo hello
RUN echo world
29) thay vì trích dẫn đơn (
        # this is a comment-line
    RUN echo hello
RUN echo world
30).

Thư mục máy chủ được khai báo tại thời gian chạy của container: thư mục máy chủ (điểm mountpoint), theo bản chất của nó, phụ thuộc vào máy chủ. Điều này là để bảo tồn tính di động của hình ảnh, vì một thư mục máy chủ nhất định có thể được đảm bảo sẽ có sẵn trên tất cả các máy chủ. Vì lý do này, bạn có thể gắn một thư mục máy chủ từ bên trong Dockerfile. Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
18 không hỗ trợ chỉ định tham số
        # this is a comment-line
    RUN echo hello
RUN echo world
32. Bạn phải chỉ định MountPoint khi bạn tạo hoặc chạy container.

NGƯỜI SỬ DỤNG

RUN echo "\
     hello\
     world"
4

hoặc

Lệnh

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
17 đặt tên người dùng (hoặc UID) và tùy chọn nhóm người dùng (hoặc GID) để sử dụng làm người dùng và nhóm mặc định cho phần còn lại của giai đoạn hiện tại. Người dùng được chỉ định được sử dụng cho các hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
56 và tại thời gian chạy, chạy các lệnh
# Comment
INSTRUCTION arguments
32 và
# Comment
INSTRUCTION arguments
23 có liên quan.

Lưu ý rằng khi chỉ định một nhóm cho người dùng, người dùng sẽ chỉ có tư cách thành viên nhóm được chỉ định. Bất kỳ thành viên nhóm được cấu hình khác sẽ bị bỏ qua.

RUN echo "\
     hello\
     world"
5

Cảnh báo

Khi người dùng không có một nhóm chính thì hình ảnh (hoặc các hướng dẫn tiếp theo) sẽ được chạy với nhóm

        # this is a comment-line
    RUN echo hello
RUN echo world
37.

RUN echo "\
     hello\
     world"
6

Trên Windows, người dùng phải được tạo trước nếu nó không phải là tài khoản tích hợp. Điều này có thể được thực hiện với lệnh

        # this is a comment-line
    RUN echo hello
RUN echo world
38 được gọi là một phần của Dockerfile.

WorkDir

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
19 đặt thư mục làm việc cho bất kỳ hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
56,
# Comment
INSTRUCTION arguments
23,
# Comment
INSTRUCTION arguments
32,
qwerty = "a = 2"
exec(qwerty)
print(a)
79 và
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
10 theo nó trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40. Nếu
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
19 không tồn tại, nó sẽ được tạo ngay cả khi nó không được sử dụng trong bất kỳ lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
40 nào sau đó.

Arg

RUN echo "\
     hello\
     world"
7

Hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
49 xác định một biến mà người dùng có thể chuyển theo thời gian xây dựng cho trình xây dựng với lệnh
# Comment
RUN echo 'we are running some # of cool things'
41 bằng cờ
        # this is a comment-line
    RUN echo hello
RUN echo world
66. Nếu người dùng chỉ định một đối số xây dựng không được xác định trong Dockerfile, bản dựng sẽ đưa ra cảnh báo.

RUN echo "\
     hello\
     world"
8

Dockerfile có thể bao gồm một hoặc nhiều hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
49. Ví dụ: sau đây là Dockerfile hợp lệ:

RUN echo "\
     hello\
     world"
9

Warning:

Không nên sử dụng các biến thời gian xây dựng để truyền các bí mật như khóa GitHub, thông tin đăng nhập của người dùng, v.v. Các giá trị biến thời gian xây dựng có thể hiển thị cho bất kỳ người dùng nào của hình ảnh với lệnh

        # this is a comment-line
    RUN echo hello
RUN echo world
68.

Tham khảo phần

        # this is a comment-line
    RUN echo hello
RUN echo world
69 để tìm hiểu về các cách an toàn để sử dụng bí mật khi xây dựng hình ảnh.

Giá trị mặc định

Lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
49 có thể tùy chọn bao gồm giá trị mặc định:

qwerty = "a = 2"
exec(qwerty)
print(a)
00

Nếu một lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
49 có giá trị mặc định và nếu không có giá trị được truyền vào thời gian xây dựng, thì nhà xây dựng sẽ sử dụng mặc định.

Phạm vi

Một định nghĩa biến

qwerty = "a = 2"
exec(qwerty)
print(a)
49 có hiệu lực từ dòng mà nó được xác định trong
qwerty = "a = 2"
exec(qwerty)
print(a)
40 không phải từ đối số sử dụng trên dòng lệnh hoặc ở nơi khác. Ví dụ, hãy xem xét Dockerfile này:

qwerty = "a = 2"
exec(qwerty)
print(a)
01

Người dùng xây dựng tệp này bằng cách gọi:

qwerty = "a = 2"
exec(qwerty)
print(a)
02

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
17 ở dòng 2 đánh giá là
        # this is a comment-line
    RUN echo hello
RUN echo world
75 là biến
        # this is a comment-line
    RUN echo hello
RUN echo world
76 được xác định trên dòng tiếp theo 3.
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
17 tại dòng 4 đánh giá thành
        # this is a comment-line
    RUN echo hello
RUN echo world
78 khi
        # this is a comment-line
    RUN echo hello
RUN echo world
76 được xác định và giá trị
        # this is a comment-line
    RUN echo hello
RUN echo world
78 được chuyển trên dòng lệnh. Trước định nghĩa của nó bằng lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
49, mọi cách sử dụng biến có thể dẫn đến một chuỗi trống.

Một hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
49 đi ra khỏi phạm vi ở cuối giai đoạn xây dựng nơi nó được xác định. Để sử dụng ARG trong nhiều giai đoạn, mỗi giai đoạn phải bao gồm hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
49.

qwerty = "a = 2"
exec(qwerty)
print(a)
03

Sử dụng các biến ARG

Bạn có thể sử dụng hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
49 hoặc
qwerty = "a = 2"
exec(qwerty)
print(a)
87 để chỉ định các biến có sẵn cho lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
56. Các biến môi trường được xác định bằng cách sử dụng lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
87 luôn ghi đè một lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
49 cùng tên. Hãy xem xét Dockerfile này với hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
87 và
qwerty = "a = 2"
exec(qwerty)
print(a)
49.

qwerty = "a = 2"
exec(qwerty)
print(a)
04

Sau đó, giả sử hình ảnh này được xây dựng với lệnh này:

qwerty = "a = 2"
exec(qwerty)
print(a)
05

Trong trường hợp này, lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
56 sử dụng
        # this is a comment-line
    RUN echo hello
RUN echo world
92 thay vì cài đặt
qwerty = "a = 2"
exec(qwerty)
print(a)
49 được truyền bởi người dùng: ________ 794 Hành vi này tương tự như tập lệnh shell trong đó biến có phạm vi cục bộ ghi đè các biến được truyền dưới dạng đối số hoặc được kế thừa từ môi trường, từ điểm định nghĩa của nó.

Sử dụng ví dụ ở trên nhưng đặc tả

qwerty = "a = 2"
exec(qwerty)
print(a)
87 khác nhau, bạn có thể tạo các tương tác hữu ích hơn giữa các hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
49 và
qwerty = "a = 2"
exec(qwerty)
print(a)
87:

qwerty = "a = 2"
exec(qwerty)
print(a)
06

Không giống như một lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
49, các giá trị
qwerty = "a = 2"
exec(qwerty)
print(a)
87 luôn được tồn tại trong hình ảnh được xây dựng. Hãy xem xét bản dựng Docker mà không có cờ
# this is a comment-line
RUN echo hello
RUN echo world
00:

Sử dụng ví dụ Dockerfile này,

# this is a comment-line
RUN echo hello
RUN echo world
01 vẫn còn tồn tại trong hình ảnh nhưng giá trị của nó sẽ là
        # this is a comment-line
    RUN echo hello
RUN echo world
92 vì đây là thứ được đặt mặc định trong dòng 3 theo lệnh
qwerty = "a = 2"
exec(qwerty)
print(a)
87.

Kỹ thuật mở rộng biến trong ví dụ này cho phép bạn chuyển các đối số từ dòng lệnh và tồn tại trong hình ảnh cuối cùng bằng cách tận dụng lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
87. Mở rộng biến chỉ được hỗ trợ cho một bộ hướng dẫn Dockerfile giới hạn.

Arg được xác định trước

Docker có một tập hợp các biến

qwerty = "a = 2"
exec(qwerty)
print(a)
49 được xác định trước mà bạn có thể sử dụng mà không cần hướng dẫn
qwerty = "a = 2"
exec(qwerty)
print(a)
49 tương ứng trong Dockerfile.

  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    07
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    08
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    09
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    10
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    11
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    12
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    13
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    14
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    15
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    16

Để sử dụng chúng, hãy truyền chúng trên dòng lệnh bằng cờ

# this is a comment-line
RUN echo hello
RUN echo world
00, ví dụ:

qwerty = "a = 2"
exec(qwerty)
print(a)
07

Theo mặc định, các biến được xác định trước này được loại trừ khỏi đầu ra của

        # this is a comment-line
    RUN echo hello
RUN echo world
68. Không bao gồm chúng làm giảm nguy cơ vô tình rò rỉ thông tin xác thực nhạy cảm trong biến
# this is a comment-line
RUN echo hello
RUN echo world
07.

Ví dụ: xem xét việc xây dựng Dockerfile sau đây bằng cách sử dụng

# this is a comment-line
RUN echo hello
RUN echo world
20

qwerty = "a = 2"
exec(qwerty)
print(a)
08

Trong trường hợp này, giá trị của biến

# this is a comment-line
RUN echo hello
RUN echo world
07 không có sẵn trong
        # this is a comment-line
    RUN echo hello
RUN echo world
68 và không được lưu trữ. Nếu bạn thay đổi vị trí và máy chủ proxy của bạn đã thay đổi thành
# this is a comment-line
RUN echo hello
RUN echo world
23, bản dựng tiếp theo không dẫn đến bỏ lỡ bộ đệm.

Nếu bạn cần ghi đè hành vi này thì bạn có thể làm như vậy bằng cách thêm câu lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
49 trong Dockerfile như sau:

qwerty = "a = 2"
exec(qwerty)
print(a)
09

Khi xây dựng Dockerfile này,

# this is a comment-line
RUN echo hello
RUN echo world
07 được bảo tồn trong
        # this is a comment-line
    RUN echo hello
RUN echo world
68 và thay đổi giá trị của nó vô hiệu hóa bộ đệm xây dựng.

Nền tảng tự động Args trong phạm vi toàn cầu

Tính năng này chỉ có sẵn khi sử dụng phụ trợ BuildKit.

Docker xác định trước một tập hợp các biến

qwerty = "a = 2"
exec(qwerty)
print(a)
49 với thông tin trên nền tảng của nút thực hiện bản dựng (nền tảng xây dựng) và trên nền tảng của hình ảnh kết quả (nền tảng đích). Nền tảng đích có thể được chỉ định với cờ
def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
92 trên
# Comment
RUN echo 'we are running some # of cool things'
41.

Các biến

qwerty = "a = 2"
exec(qwerty)
print(a)
49 sau đây được đặt tự động:

  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    31 - Nền tảng của kết quả xây dựng. Ví dụ
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    94,
    # this is a comment-line
    RUN echo hello
    RUN echo world
    
    33,
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    96.
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    35 - Thành phần hệ điều hành của TargetPlatform
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    36 - Thành phần kiến ​​trúc của TargetPlatform
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    37 - Thành phần biến thể của TargetPlatform
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    38 - Nền tảng của nút thực hiện bản dựng.
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    39 - Thành phần hệ điều hành của BuildPlatform
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    40 - Thành phần kiến ​​trúc của BuildPlatform
  • # this is a comment-line
    RUN echo hello
    RUN echo world
    
    41 - Thành phần biến thể của BuildPlatform

Các đối số này được xác định trong phạm vi toàn cầu, vì vậy không tự động có sẵn bên trong các giai đoạn xây dựng hoặc cho các lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
56 của bạn. Để phơi bày một trong những đối số này bên trong giai đoạn xây dựng xác định lại nó mà không có giá trị.

Ví dụ:

qwerty = "a = 2"
exec(qwerty)
print(a)
10

Buildkit tích hợp xây dựng args

ArgLoại hìnhSự mô tả
# this is a comment-line
RUN echo hello
RUN echo world
43
Sợi dâyĐặt không gian tên ID bộ đệm tùy chọn.
# this is a comment-line
RUN echo hello
RUN echo world
44
BoolKích hoạt bối cảnh Git để giữ thư mục
# Comment
RUN echo 'we are running some # of cool things'
77.
# this is a comment-line
RUN echo hello
RUN echo world
462
BoolKích hoạt bối cảnh Git để giữ thư mục
# Comment
RUN echo 'we are running some # of cool things'
77.
# this is a comment-line
RUN echo hello
RUN echo world
462
BoolKích hoạt bối cảnh Git để giữ thư mục
# Comment
RUN echo 'we are running some # of cool things'
77.
# this is a comment-line
RUN echo hello
RUN echo world
462
BoolKích hoạt bối cảnh Git để giữ thư mục
# Comment
RUN echo 'we are running some # of cool things'
77.
# this is a comment-line
RUN echo hello
RUN echo world
462
Sợi dâyĐặt không gian tên ID bộ đệm tùy chọn.
# this is a comment-line
RUN echo hello
RUN echo world
44
Sợi dâyĐặt không gian tên ID bộ đệm tùy chọn.
# this is a comment-line
RUN echo hello
RUN echo world
44
BoolKích hoạt bối cảnh Git để giữ thư mục
# Comment
RUN echo 'we are running some # of cool things'
77.

# this is a comment-line
RUN echo hello
RUN echo world
462

Thuộc tính thông tin xây dựng nội tuyến trong cấu hình hình ảnh hay không.

qwerty = "a = 2"
exec(qwerty)
print(a)
11

qwerty = "a = 2"
exec(qwerty)
print(a)
12

# this is a comment-line RUN echo hello RUN echo world 472

Siêu dữ liệu bộ đệm nội tuyến để cấu hình hình ảnh hay không.

# this is a comment-line
RUN echo hello
RUN echo world
48

qwerty = "a = 2"
exec(qwerty)
print(a)
13

qwerty = "a = 2"
exec(qwerty)
print(a)
14

Chọn vào đầu ra xác định bất kể đầu ra đa nền tảng hay không.

# this is a comment-line
RUN echo hello
RUN echo world
49

qwerty = "a = 2"
exec(qwerty)
print(a)
15

Đặt tên máy chủ (mặc định

# this is a comment-line
RUN echo hello
RUN echo world
50)

# this is a comment-line
RUN echo hello
RUN echo world
51

qwerty = "a = 2"
exec(qwerty)
print(a)
16

Đặt hình ảnh phía trước

# this is a comment-line RUN echo hello RUN echo world 52

Int

Đặt dấu thời gian UNIX cho hình ảnh và lớp được tạo. Thông tin thêm từ các bản dựng có thể tái tạo. Được hỗ trợ kể từ Dockerfile 1.5, BuildKit 0.11 (chưa phát hành)

Ví dụ: Giữ

# Comment
RUN echo 'we are running some # of cool things'
77 DIR

Khi sử dụng bối cảnh Git,

# Comment
RUN echo 'we are running some # of cool things'
77 DIR không được giữ trong các lần kiểm tra Git. Nó có thể hữu ích để giữ nó xung quanh nếu bạn muốn truy xuất thông tin git trong quá trình xây dựng của mình:

Tác động đến bộ nhớ đệm xây dựng

Ở đây, cách thức hoạt động của nó:

  1. Khi nó gặp phải một hướng dẫn
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    20, nhà xây dựng sẽ thêm một kích hoạt cho siêu dữ liệu của hình ảnh được xây dựng. Hướng dẫn không ảnh hưởng đến bản dựng hiện tại.
  2. Vào cuối bản dựng, một danh sách tất cả các yếu tố kích hoạt được lưu trữ trong biểu hiện hình ảnh, dưới khóa
    # this is a comment-line
    RUN echo hello
    RUN echo world
    
    85. Chúng có thể được kiểm tra với lệnh
    # Comment
    INSTRUCTION arguments
    
    63.
  3. Sau đó, hình ảnh có thể được sử dụng làm cơ sở cho bản dựng mới, sử dụng lệnh
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46. Là một phần của việc xử lý hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46, trình xây dựng hạ lưu tìm kiếm các kích hoạt
    def abc():
        qwerty = 'a = 2'
        exec(qwerty, globals())
    abc()
    print(a)  # outputs 2
    
    20 và thực hiện chúng theo cùng một thứ tự mà chúng đã được đăng ký. Nếu bất kỳ yếu tố kích hoạt nào thất bại, hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 bị hủy bỏ, điều này khiến cho việc xây dựng bị lỗi. Nếu tất cả các yếu tố kích hoạt thành công, hướng dẫn
    qwerty = "a = 2"
    exec(qwerty)
    print(a)
    
    46 hoàn thành và bản dựng tiếp tục như bình thường.
  4. Các kích hoạt được xóa khỏi hình ảnh cuối cùng sau khi được thực thi. Nói cách khác, chúng không được thừa hưởng bởi các tổ chức cháu của ông.

Ví dụ: bạn có thể thêm một cái gì đó như thế này:

qwerty = "a = 2"
exec(qwerty)
print(a)
17

Cảnh báo

Chuỗi hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
20 sử dụng
# this is a comment-line
RUN echo hello
RUN echo world
93 được phép.

Cảnh báo

Chuỗi hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
20 sử dụng
# this is a comment-line
RUN echo hello
RUN echo world
93 được phép.

Hướng dẫn def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2 20 có thể không kích hoạt hướng dẫn qwerty = "a = 2" exec(qwerty) print(a) 46 hoặc # Comment INSTRUCTION arguments 61.

Dừng lại

Hướng dẫn

def abc():
    qwerty = 'a = 2'
    exec(qwerty, globals())
abc()
print(a)  # outputs 2
16 đặt tín hiệu cuộc gọi hệ thống sẽ được gửi đến container để thoát. Tín hiệu này có thể là một tên tín hiệu trong định dạng
# this is a comment-line
RUN echo hello
RUN echo world
98, ví dụ
        # this is a comment-line
    RUN echo hello
RUN echo world
04 hoặc một số không dấu phù hợp với vị trí trong bảng Syscall kernel, ví dụ
RUN echo "\
     hello\
     world"
00. Mặc định là
RUN echo hello \
# comment
world
63 nếu không được xác định.

Hình ảnh dừng mặc định có thể được ghi đè trên mỗi container, sử dụng cờ RUN echo "\ hello\ world" 02 trên # Comment INSTRUCTION arguments 48 và RUN echo "\ hello\ world" 04.

KIỂM TRA SỨC KHỎE

  • Hướng dẫn
    RUN echo "\
         hello\
         world"
    
    05 có hai biểu mẫu:
  • RUN echo "\
         hello\
         world"
    
    06 (Kiểm tra sức khỏe của container bằng cách chạy một lệnh bên trong container)

RUN echo "\
     hello\
     world"
07 (Vô hiệu hóa bất kỳ sức khỏe nào được thừa hưởng từ hình ảnh cơ sở)

Hướng dẫn

RUN echo "\
     hello\
     world"
05 cho Docker biết cách kiểm tra một thùng chứa để kiểm tra xem nó có còn hoạt động không. Điều này có thể phát hiện các trường hợp như máy chủ web bị kẹt trong vòng lặp vô hạn và không thể xử lý các kết nối mới, mặc dù quy trình máy chủ vẫn đang chạy.

Khi một container có một HealthCheck được chỉ định, nó có tình trạng sức khỏe ngoài tình trạng bình thường. Trạng thái này ban đầu là

RUN echo "\
     hello\
     world"
09. Bất cứ khi nào một kiểm tra sức khỏe vượt qua, nó sẽ trở thành
RUN echo "\
     hello\
     world"
10 (bất kể trạng thái nào trước đây). Sau một số lần thất bại liên tiếp nhất định, nó trở thành
RUN echo "\
     hello\
     world"
11.

  • Các tùy chọn có thể xuất hiện trước
    # Comment
    INSTRUCTION arguments
    
    23 là:
  • RUN echo "\
         hello\
         world"
    
    13 (mặc định:
    RUN echo "\
         hello\
         world"
    
    14)
  • RUN echo "\
         hello\
         world"
    
    15 (mặc định:
    RUN echo "\
         hello\
         world"
    
    14)
  • RUN echo "\
         hello\
         world"
    
    17 (mặc định:
    RUN echo "\
         hello\
         world"
    
    18)

RUN echo "\
     hello\
     world"
19 (mặc định:
RUN echo "\
     hello\
     world"
20)interval seconds after the container is started, and then again interval seconds after each previous check completes.

Kiểm tra sức khỏe trước tiên sẽ chạy khoảng giây sau khi container được bắt đầu, và sau đó một lần nữa khoảng vài giây sau khi mỗi lần kiểm tra trước đó hoàn tất.timeout seconds then the check is considered to have failed.

Nếu một lần chạy của séc mất nhiều thời gian hơn thời gian chờ thì séc được coi là không thành công.retries consecutive failures of the health check for the container to be considered

RUN echo "\
     hello\
     world"
11.

Phải mất các thất bại liên tiếp của kiểm tra sức khỏe cho container được coi là

RUN echo "\
     hello\
     world"
11. provides initialization time for containers that need time to bootstrap. Probe failure during that period will not be counted towards the maximum number of retries. However, if a health check succeeds during the start period, the container is considered started and all consecutive failures will be counted towards the maximum number of retries.

Thời gian bắt đầu cung cấp thời gian khởi tạo cho các thùng chứa cần thời gian để bootstrap. Thất bại thăm dò trong khoảng thời gian đó sẽ không được tính vào số lần thử lại tối đa. Tuy nhiên, nếu kiểm tra sức khỏe thành công trong thời gian bắt đầu, container được coi là bắt đầu và tất cả các lỗi liên tiếp sẽ được tính vào số lần thử lại tối đa.

Chỉ có thể có một hướng dẫn

RUN echo "\
     hello\
     world"
05 trong Dockerfile. Nếu bạn liệt kê nhiều hơn một thì chỉ có hiệu lực
RUN echo "\
     hello\
     world"
05 cuối cùng.

Lệnh sau từ khóa

# Comment
INSTRUCTION arguments
23 có thể là lệnh shell (ví dụ:
RUN echo "\
     hello\
     world"
25) hoặc mảng EXEC (như với các lệnh dockerfile khác; xem ví dụ
# Comment
INSTRUCTION arguments
32 để biết chi tiết).

  • Trạng thái thoát ra lệnh cho biết trạng thái sức khỏe của container. Các giá trị có thể là:
  • 0: Thành công - Container khỏe mạnh và sẵn sàng sử dụng
  • 1: Không lành mạnh - Container không hoạt động chính xác

2: Đặt trước - Không sử dụng mã thoát này

qwerty = "a = 2"
exec(qwerty)
print(a)
18

Ví dụ: để kiểm tra cứ sau năm phút hoặc do đó máy chủ web có thể phục vụ trang chính của trang web trong vòng ba giây:

Để giúp gỡ lỗi các đầu dò không thành công, bất kỳ văn bản đầu ra nào (UTF-8 được mã hóa) mà lệnh ghi trên stdout hoặc stderr sẽ được lưu trữ trong tình trạng sức khỏe và có thể được truy vấn bằng

# Comment
INSTRUCTION arguments
63. Đầu ra như vậy nên được giữ ngắn (chỉ có 4096 byte đầu tiên được lưu trữ hiện tại).

Khi tình trạng sức khỏe của một container thay đổi, một sự kiện RUN echo "\ hello\ world" 28 được tạo ra với trạng thái mới.

qwerty = "a = 2"
exec(qwerty)
print(a)
19

VỎ BỌC

Hướng dẫn

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 đặc biệt hữu ích trên các cửa sổ trong đó có hai vỏ thường được sử dụng và khá khác nhau:
RUN echo "\
     hello\
     world"
34 và
RUN echo "\
     hello\
     world"
35, cũng như các vỏ thay thế có sẵn bao gồm
RUN echo "\
     hello\
     world"
36.

Hướng dẫn

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 có thể xuất hiện nhiều lần. Mỗi hướng dẫn
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 ghi đè tất cả các hướng dẫn
loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 trước đó và ảnh hưởng đến tất cả các hướng dẫn tiếp theo. Ví dụ:

qwerty = "a = 2"
exec(qwerty)
print(a)
20

Các hướng dẫn sau đây có thể bị ảnh hưởng bởi hướng dẫn

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 khi dạng vỏ của chúng được sử dụng trong Dockerfile:
qwerty = "a = 2"
exec(qwerty)
print(a)
56,
# Comment
INSTRUCTION arguments
23 và
# Comment
INSTRUCTION arguments
32.

Ví dụ sau đây là một mẫu phổ biến được tìm thấy trên Windows có thể được sắp xếp hợp lý bằng cách sử dụng lệnh

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15:

qwerty = "a = 2"
exec(qwerty)
print(a)
21

Lệnh do Docker gọi sẽ là:

qwerty = "a = 2"
exec(qwerty)
print(a)
22

Điều này là không hiệu quả vì hai lý do. Đầu tiên, có một bộ xử lý lệnh CMD.exe không cần thiết (còn gọi là Shell) được gọi. Thứ hai, mỗi hướng dẫn

qwerty = "a = 2"
exec(qwerty)
print(a)
56 ở dạng shell yêu cầu thêm tiền tố
RUN echo "\
     hello\
     world"
46.

Để làm cho điều này hiệu quả hơn, một trong hai cơ chế có thể được sử dụng. Một là sử dụng dạng JSON của lệnh Run như:

qwerty = "a = 2"
exec(qwerty)
print(a)
23

Mặc dù hình thức JSON không rõ ràng và không sử dụng CMD.exe không cần thiết, nhưng nó đòi hỏi nhiều tính xác suất hơn thông qua việc chạy hai lần và thoát ra. Cơ chế thay thế là sử dụng lệnh

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 và biểu mẫu shell, tạo ra cú pháp tự nhiên hơn cho người dùng Windows, đặc biệt là khi kết hợp với Chỉ thị trình phân tích cú pháp
qwerty = "a = 2"
exec(qwerty)
print(a)
62:

qwerty = "a = 2"
exec(qwerty)
print(a)
24

Kết quả là:

qwerty = "a = 2"
exec(qwerty)
print(a)
25

Hướng dẫn

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 cũng có thể được sử dụng để sửa đổi cách thức hoạt động của vỏ. Ví dụ: sử dụng
RUN echo "\
     hello\
     world"
50 trên Windows, có thể sửa đổi các ngữ nghĩa mở rộng biến đổi môi trường bị trì hoãn.

Hướng dẫn

loc = {}
def abc():
    qwerty = "a = 2"
    exec(qwerty, globals(), loc)
abc()
print(loc['a'])
15 cũng có thể được sử dụng trên Linux nếu cần có vỏ thay thế, chẳng hạn như
RUN echo "\
     hello\
     world"
52,
RUN echo "\
     hello\
     world"
53,
RUN echo "\
     hello\
     world"
54 và các loại khác.

Ở đây-DOCUMENT

Ghi chú

Được thêm vào trong

RUN echo hello \
# comment
world
32

Ở đây, các công tắc cho phép chuyển hướng các dòng dockerfile tiếp theo đến đầu vào của các lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
56 hoặc
qwerty = "a = 2"
exec(qwerty)
print(a)
79. Nếu lệnh đó chứa một tài liệu ở đây, Dockerfile sẽ xem xét các dòng tiếp theo cho đến khi dòng chỉ chứa một dấu phân cách ở đây là một phần của cùng một lệnh.

Ví dụ: Chạy tập lệnh đa dòng

qwerty = "a = 2"
exec(qwerty)
print(a)
26

Nếu lệnh chỉ chứa một tài liệu ở đây, nội dung của nó được đánh giá bằng shell mặc định.

qwerty = "a = 2"
exec(qwerty)
print(a)
27

Ngoài ra, tiêu đề Shebang có thể được sử dụng để xác định một thông dịch viên.

qwerty = "a = 2"
exec(qwerty)
print(a)
28

Các ví dụ phức tạp hơn có thể sử dụng nhiều người ở đây.

qwerty = "a = 2"
exec(qwerty)
print(a)
29

Ví dụ: Tạo tệp nội tuyến

Trong các lệnh

qwerty = "a = 2"
exec(qwerty)
print(a)
79 Các tham số nguồn có thể được thay thế bằng các chỉ số ở đây-DOC. Áp dụng mở rộng biến ở đây-DOC và Tab Striping áp dụng.

qwerty = "a = 2"
exec(qwerty)
print(a)
30

qwerty = "a = 2"
exec(qwerty)
print(a)
31

Ví dụ Dockerfile

Để biết ví dụ về Dockerfiles, hãy tham khảo:

  • Phần Xây dựng hình ảnh ”
  • Hướng dẫn của Get Get bắt đầu
  • Hướng dẫn bắt đầu cụ thể về ngôn ngữ