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
Nhưng, khi tôi không sử dụng def, nó đang hoạt động:
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 32:There are 3 ways to call the 32 function:
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:
Đã trả lời ngày 4 tháng 4 năm 2021 lúc 11:55Apr 4, 2021 at 11:55
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 37khô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 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..
sau đó sẽ xuất ra 39Đã trả lời ngày 4 tháng 4 năm 2021 lúc 11:42Apr 4, 2021 at 11:42
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ừ 40. 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 40.Định dạngĐây là định dạng của 40:
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 40 theo thứ tự. A 40 phải bắt đầu bằng lệnh 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 46 chỉ định hình ảnh mẹ mà bạn đang xây dựng. 46 chỉ có thể được đi trước bởi một hoặc nhiều hướng dẫn 49, trong đó khai báo các đối số được sử dụng trong các dòng 46 trong 40.must begin with a 46 instruction. This may be after parser directives, comments, and globally scoped ARGs. The 46 instruction
specifies the Parent Image from which you are building. 46 may only be preceded by one or more 49 instructions, which declare arguments that are used in 46 lines in the 40.Docker coi các dòng bắt đầu bằng 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 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ư:
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 54 và cả hai ví dụ dưới đây đều tương đương:
Các ký tự tiếp tục dòng không được hỗ trợ trong các bình luận.
Chỉ thị phân tích cú phápCá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 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 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 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: 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: 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: 2Chỉ 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. 3Whitespace 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: 4Các chỉ thị phân tích cú pháp sau đây được hỗ trợ:
Cú phápTí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ỏiHoặc Chỉ thị 62 đặt ký tự được sử dụng để thoát các ký tự trong một 40. Nếu không được chỉ định, ký tự thoát mặc định là 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 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 62 có được bao gồm trong 40 hay không, việc thoát ra không được thực hiện trong lệnh 56, ngoại trừ ở cuối dòng.Đặt ký tự thoát thành 70 đặc biệt hữu ích trên 71, trong đó 65 là bộ phân cách đường dẫn thư mục. 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 71. 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 65 đầu tiên. Tương tự, 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: 5Kết quả trong: 6Một giải pháp cho những điều trên là sử dụng 78 làm mục tiêu của cả hướng dẫn 79 và 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 71, và tệ nhất, lỗi dễ bị tất cả các lệnh trên 71 hỗ trợ 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 62, 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 71: 7Kết quả trong: 8Mộ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 62, 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 71: 7Thay thế môi trường
Cú pháp 91 cũng hỗ trợ một vài bộ điều chỉnh 94 tiêu chuẩn như được chỉ định dưới đây: 95 chỉ ra rằng nếu 96 được đặt thì kết quả sẽ là giá trị đó. Nếu 96 không được đặt thì 98 sẽ là kết quả.Ví dụ (biểu diễn phân tích cú pháp được hiển thị sau 52): 9Các biến môi trường được hỗ trợ bởi danh sách các hướng dẫn sau đây trong 40:
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: 0sẽ dẫn đến 21 có giá trị 22, không phải 23. Tuy nhiên, 24 sẽ có giá trị 23 vì nó không phải là một phần của hướng dẫn tương tự đặt 26 thành 23..Dockerignore tệpTrướ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 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 10 hoặc 79.CLI diễn giải tệp 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 32 và 33 đều loại trừ một tệp hoặc thư mục có tên 34 trong thư mục con 35 của 36 hoặc trong gốc của kho lưu trữ Git nằm ở 37. Không loại trừ bất cứ điều gì khác.Nếu một dòng trong tệp 28 bắt đầu bằng 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ụ 28 tệp: 1Tệp này gây ra hành vi xây dựng sau:
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ố 53 và 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 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ụ, 56 sẽ loại trừ tất cả các tệp kết thúc bằng 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 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ụ 28 sử dụng cơ chế này: 2Tất cả các tệp Markdown ngoại trừ 60 được loại trừ khỏi ngữ cảnh.Vị trí của các quy tắc ngoại lệ 58 ảnh hưởng đến hành vi: dòng cuối cùng của 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: 3Khô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 63.Bây giờ hãy xem xét ví dụ này: 4Tất cả các tệp readme được bao gồm. Dòng giữa không có hiệu lực vì 64 khớp với 63 và đến cuối cùng.Bạn thậm chí có thể sử dụng tệp 28 để loại trừ các tệp 40 và 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 10 và 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 71 là mẫu đầu tiên, theo sau là một hoặc nhiều mẫu ngoại lệ 58.
TỪ 5Hoặc 6Hoặc 7Hướng dẫn 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, 40 hợp lệ phải bắt đầu với lệnh 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.
Cờ 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 46 tham chiếu hình ảnh đa nền tảng. Ví dụ: 94, 95 hoặc 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 ( 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 46 Hướng dẫn hỗ trợ các biến được khai báo bởi bất kỳ hướng dẫn 49 nào xảy ra trước lần đầu tiên 46.
8Một 49 được tuyên bố trước 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 46. Để sử dụng giá trị mặc định của 49 được khai báo trước khi 46 đầu tiên sử dụng lệnh 49 mà không có giá trị bên trong giai đoạn xây dựng: 9CHẠYChạy có 2 hình thức:
Hướng dẫn 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 40.Layering 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 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 15.Trong biểu mẫu Shell, bạn có thể sử dụng 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: 0Họ cùng nhau tương đương với dòng duy nhất này: 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ụ: 2
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ụ, 17 sẽ không thay thế biến trên 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ụ: 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.
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 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ư 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 56 có thể được vô hiệu hóa bằng cách sử dụng cờ 23, ví dụ 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.
Chạy - -mount
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: 37Gắn các loại
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.
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'])
|
Quyền mua | Sự mô tả |
---|---|
38 (mặc định) | Thư mục bối cảnh gắn kết (chỉ đọc). |
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 mua | Sự mô tả |
---|---|
38 (mặc định) | Thư mục bối cảnh gắn kết (chỉ đọc). |
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. |
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. |
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. |
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 mua
loc = {}
def abc():
qwerty = "a = 2"
exec(qwerty, globals(), loc)
abc()
print(loc['a'])
7loc = {}
def abc():
qwerty = "a = 2"
exec(qwerty, globals(), loc)
abc()
print(loc['a'])
8loc = {} def abc(): qwerty = "a = 2" exec(qwerty, globals(), loc) abc() print(loc['a']) 421
Gắn dẫn đường.
Quyền mua | Sự mô tả |
---|---|
38 (mặc định) | Thư mục bối cảnh gắn kết (chỉ đọc). |
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. |
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. |
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. |
68 | ID người dùng cho ổ cắm. Mặc định 69. |
70 | ID nhóm cho ổ cắm. Mặc định 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
0Bạ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
03# Comment INSTRUCTION arguments
# 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
05Các loại mạng
Loại hình | Sự mô tả |
---|---|
06 (mặc định) | Chạy trong mạng mặc định. |
07 | Chạy mà không có quyền truy cập mạng. |
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
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.# Comment INSTRUCTION arguments
Chạy -an toàn
Ghi chú
Được thêm vào trong
03# Comment INSTRUCTION arguments
# 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
05Cảnh báo
Việc sử dụng
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.# Comment INSTRUCTION arguments
Chạy -an toàn
# Comment
INSTRUCTION arguments
2# Comment
INSTRUCTION arguments
3Chư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
22, nhưng đó là không có op.# Comment INSTRUCTION arguments
CMD
Hướng dẫn
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
# 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
03# Comment INSTRUCTION arguments
# 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
05Các loại mạng
# Comment
INSTRUCTION arguments
4Loạ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
5Sự mô tả
# Comment
INSTRUCTION arguments
06 (mặc định)Ghi chú
Được thêm vào trong
03# Comment INSTRUCTION arguments
# 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
6Cú pháp:
# Comment
INSTRUCTION arguments
05# Comment
INSTRUCTION arguments
7Mộ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
9Ghi 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ụ:
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.# Comment INSTRUCTION arguments
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'
1Ngườ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'
3Hướ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'
4Trong 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'
6Hướ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'
7Cá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'
8Hoặ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'
9Cú pháp thay thế
Hướng dẫn
87 cũng cho phép một cú pháp thay thếqwerty = "a = 2" exec(qwerty) print(a)
90, bỏ qua# Comment INSTRUCTION arguments
91. Ví dụ:# Comment INSTRUCTION arguments
Cú pháp này không cho phép nhiều varia môi trường được đặt trong một lệnh
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 (qwerty = "a = 2" exec(qwerty) print(a)
93) với giá trị# Comment INSTRUCTION arguments
94:# Comment INSTRUCTION arguments
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
0Hì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
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.# Comment INSTRUCTION arguments
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
1Trong 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'
07RUN echo hello \
# comment
world
2Khi 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
3Nế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
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.# Comment INSTRUCTION arguments
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
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.# Comment INSTRUCTION arguments
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
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.# Comment INSTRUCTION arguments
Mỗi
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ụ:# Comment INSTRUCTION arguments
Để thêm tất cả các tệp bắt đầu bằng cách hom hom:
Nếu
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.# Comment INSTRUCTION arguments
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
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 INSTRUCTION arguments
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:# Comment RUN echo 'we are running some # of cool things'
- 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.
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
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 INSTRUCTION arguments
53, kết quả là sự kết hợp của:# Comment RUN echo 'we are running some # of cool things'
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
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.# Comment RUN echo 'we are running some # of cool things'
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
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì# Comment INSTRUCTION arguments
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# Comment RUN echo 'we are running some # of cool things'
78.qwerty = "a = 2" exec(qwerty) print(a)
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
4Nế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
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì# Comment INSTRUCTION arguments
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# Comment RUN echo 'we are running some # of cool things'
78.qwerty = "a = 2" exec(qwerty) print(a)
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
5RUN echo hello \
# comment
world
6Nế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
7Tổ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
8RUN echo hello \
# comment
world
9Cờ # 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'
72Biể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
0Thê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
1Hướ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
2Nhiề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
3Mỗ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
4Nế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 (
06), không có ngữ cảnh xây dựng, do đó,RUN echo hello \ # comment world
79 có thể được sử dụng.qwerty = "a = 2" exec(qwerty) print(a)
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
99 phải nằm trong bối cảnh của bản dựng; Bạn không thể# Comment INSTRUCTION arguments
13, bởi vì bước đầu tiên củaRUN echo hello \ # comment world
41 là gửi thư mục ngữ cảnh (và thư mục con) đến docker daemon.# Comment RUN echo 'we are running some # of cool things'
Nếu
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.# Comment INSTRUCTION arguments
Ghi chú
Nếu bạn xây dựng bằng cách sử dụng stdin (
06), không có ngữ cảnh xây dựng, do đó,RUN echo hello \ # comment world
79 có thể được sử dụng.qwerty = "a = 2" exec(qwerty) print(a)
Tùy chọn
79 chấp nhận cờqwerty = "a = 2" exec(qwerty) print(a)
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ằngRUN 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ế.RUN echo hello \ # comment world
79 tuân theo các quy tắc sau:qwerty = "a = 2" exec(qwerty) print(a)
Đường dẫn
99 phải nằm trong bối cảnh của bản dựng; Bạn không thể# Comment INSTRUCTION arguments
13, bởi vì bước đầu tiên củaRUN echo hello \ # comment world
41 là gửi thư mục ngữ cảnh (và thư mục con) đến docker daemon.# Comment RUN echo 'we are running some # of cool things'
Nếu
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.# Comment INSTRUCTION arguments
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
99 được chỉ định, trực tiếp hoặc do việc sử dụng ký tự đại diện, thì# Comment INSTRUCTION arguments
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# Comment RUN echo 'we are running some # of cool things'
78.qwerty = "a = 2" exec(qwerty) print(a)
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
5Hướ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
32Kí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à
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
35Nhậ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
7Mẫ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
9Cá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
0Khi 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
2Và 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
3Nế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
4Cuố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
5Nế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
6Ghi chú
Bạn có thể ghi đè cài đặt
32 bằng cách sử dụng# Comment INSTRUCTION arguments
83, nhưng điều này chỉ có thể đặt nhị phân thành EXEC (sẽ không sử dụngRUN echo hello \ # comment world
84).RUN echo hello \ # comment world
Ghi chú
Bạn có thể ghi đè cài đặt
32 bằng cách sử dụng# Comment INSTRUCTION arguments
83, nhưng điều này chỉ có thể đặt nhị phân thành EXEC (sẽ không sử dụngRUN echo hello \ # comment world
84).RUN echo hello \ # comment world
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
7Bạ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
8Khi 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
9Thoát khỏi sạch sẽ trên
RUN echo hello \
# comment
world
92:RUN echo "\
hello\
world"
0Nế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"
1Sau đó, 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"
2Nế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
Cả hướng dẫn
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ọ.# Comment INSTRUCTION arguments
Dockerfile nên chỉ định ít nhất một trong các lệnh
23 hoặc# Comment INSTRUCTION arguments
32.# Comment INSTRUCTION arguments
32 nên được xác định khi sử dụng container làm thực thi.# Comment INSTRUCTION arguments
23 sẽ được ghi đè khi chạy bộ chứa với các đối số thay thế.# Comment INSTRUCTION arguments
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ảnh | EntryPoint EXEC_ENTRY P1_ENTRY | EntryPoint [exec Exec_entry ,, P1_Entry,] | |
---|---|---|---|
Không có CMD | Lỗi, không được phép | /bin/sh -c exec_entry p1_entry | EXEC_ENTRY P1_ENTRY |
CMD [exec exec_cmd ,, p1_cmd,] | EXEC_CMD P1_CMD | /bin/sh -c exec_entry p1_entry | EXEC_ENTRY P1_ENTRY |
CMD [exec exec_cmd ,, p1_cmd,] | EXEC_CMD P1_CMD | /bin/sh -c exec_entry p1_entry | EXEC_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
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,def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
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.# this is a comment-line RUN echo hello RUN echo world
- Lệnh
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:# Comment INSTRUCTION arguments
- Hướng dẫn
Dockerfile này dẫn đến một hình ảnh khiến
48 tạo ra một điểm gắn kết mới tại# Comment INSTRUCTION arguments
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.# this is a comment-line RUN echo hello RUN echo world
Ghi chú về chỉ định khối lượng: The list is parsed as a JSON array. You must enclose words with double quotes (
29) rather than single quotes (# this is a comment-line RUN echo hello RUN echo world
30).# this is a comment-line RUN echo hello RUN echo world
Hãy ghi nhớ những điều sau đây về khối lượng trong
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. Theqwerty = "a = 2" exec(qwerty) print(a)
18 instruction does not support specifying adef abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
32 parameter. You must specify the mountpoint when you create or run the container.# this is a comment-line RUN echo hello RUN echo world
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
28Thay đổ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 (
29) thay vì trích dẫn đơn (# this is a comment-line RUN echo hello RUN echo world
30).# this is a comment-line RUN echo hello RUN echo world
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
18 không hỗ trợ chỉ định tham sốdef abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
32. Bạn phải chỉ định MountPoint khi bạn tạo hoặc chạy container.# this is a comment-line RUN echo hello RUN echo world
NGƯỜI SỬ DỤNG
RUN echo "\
hello\
world"
4hoặ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"
5Cả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"
6Trê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"
7Hướ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"
8Dockerfile 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
68.# this is a comment-line RUN echo hello RUN echo world
Tham khảo phần
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.# this is a comment-line RUN echo hello RUN echo world
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)
00Nế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)
01Người dùng xây dựng tệp này bằng cách gọi:
qwerty = "a = 2"
exec(qwerty)
print(a)
02def 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)
03Sử 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)
04Sau đó, 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)
05Trong 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)
06Khô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.
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# this is a comment-line RUN echo hello RUN echo world
Để 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)
07Theo 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
20qwerty = "a = 2"
exec(qwerty)
print(a)
08Trong 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)
09Khi 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:
31 - Nền tảng của kết quả xây dựng. Ví dụ# this is a comment-line RUN echo hello RUN echo world
94,def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
33,# this is a comment-line RUN echo hello RUN echo world
96.def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
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# this is a comment-line RUN echo hello RUN echo world
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)
10Buildkit tích hợp xây dựng args
Arg | Loại hình | Sự mô tả |
---|---|---|
43 | Sợi dây | Đặt không gian tên ID bộ đệm tùy chọn. |
44 | Bool | Kích hoạt bối cảnh Git để giữ thư mục 77. |
462 | Bool | Kích hoạt bối cảnh Git để giữ thư mục 77. |
462 | Bool | Kích hoạt bối cảnh Git để giữ thư mục 77. |
462 | Bool | Kích hoạt bối cảnh Git để giữ thư mục 77. |
462 | Sợi dây | Đặt không gian tên ID bộ đệm tùy chọn. |
44 | Sợi dây | Đặt không gian tên ID bộ đệm tùy chọn. |
44 | Bool | Kích hoạt bối cảnh Git để giữ thư mục 77. |
# this is a comment-line
RUN echo hello
RUN echo world
462
# this is a comment-line
RUN echo hello
RUN echo world
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)
11qwerty = "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
48qwerty = "a = 2"
exec(qwerty)
print(a)
13qwerty = "a = 2"
exec(qwerty)
print(a)
14Chọ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
49qwerty = "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
51qwerty = "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 DIRKhi 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ó:
- Khi nó gặp phải một hướng dẫn
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.def abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 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
85. Chúng có thể được kiểm tra với lệnh# this is a comment-line RUN echo hello RUN echo world
63.# Comment INSTRUCTION arguments
- 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
46. Là một phần của việc xử lý hướng dẫnqwerty = "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ạtqwerty = "a = 2" exec(qwerty) print(a)
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ẫndef abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
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ẫnqwerty = "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.qwerty = "a = 2" exec(qwerty) print(a)
- 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)
17Cảnh báo
Chuỗi hướng dẫn
20 sử dụngdef abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
93 được phép.# this is a comment-line RUN echo hello RUN echo world
Cảnh báo
Chuỗi hướng dẫn
20 sử dụngdef abc(): qwerty = 'a = 2' exec(qwerty, globals()) abc() print(a) # outputs 2
93 được phép.# this is a comment-line RUN echo hello RUN echo world
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
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"
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
23 là:# Comment INSTRUCTION arguments
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"
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à
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.RUN echo "\
hello\
world"
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)
18Ví 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)
19VỎ 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)
20Cá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)
21Lệ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)
23Mặ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)
24Kết quả là:
qwerty = "a = 2"
exec(qwerty)
print(a)
25Hướ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
32RUN echo hello \ # comment world
Ở đâ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)
26Nế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)
27Ngoà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)
28Cá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)
29Ví 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)
30qwerty = "a = 2"
exec(qwerty)
print(a)
31Ví 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ữ