Làm cách nào để bình luận trong Dockerfile?


407

Tôi đang viết một Dockerfile. Có cách nào để bình luận trong tập tin này?

Docker có một tùy chọn nhận xét lấy phần còn lại của một dòng và bỏ qua nó không?

Câu trả lời:


517

Bạn có thể sử dụng # là bắt đầu của dòng để nhận xét dòng .

# Everything on this line is a comment

Lưu ý: # như một nhận xét chỉ có thể được sử dụng ở đầu dòng.


9
Vì vậy, câu trả lời cho câu hỏi thứ hai, "Docker có tùy chọn nhận xét nào lấy phần còn lại của một dòng và bỏ qua nó không?" , có phải không? " Docker xử lý các dòng bắt đầu bằng # như một nhận xét " .
Peter Mortensen

1
Bạn có thể cập nhật câu trả lời của bạn và làm cho nó toàn diện / đầy đủ hơn không? Ví dụ, trả lời câu hỏi thứ hai.
Peter Mortensen

8
Câu trả lời của BMitch điền vào thông tin quan trọng bị thiếu trong câu trả lời này.
Jonathan

99

Như những người khác đã đề cập, ý kiến ​​được tham chiếu với một #và được ghi lại ở đây . Tuy nhiên, không giống như một số ngôn ngữ, #phải ở đầu dòng. Nếu chúng xảy ra một phần thông qua dòng, chúng được hiểu là một đối số và có thể dẫn đến hành vi không mong muốn.

# This is a comment

COPY test_dir target_dir # This is not a comment, it is an argument to COPY

RUN echo hello world # This is an argument to RUN but the shell may ignore it

Cũng cần lưu ý rằng các chỉ thị của trình phân tích cú pháp gần đây đã được thêm vào Dockerfile có cùng cú pháp như một nhận xét. Chúng cần xuất hiện ở đầu tệp, trước bất kỳ nhận xét hoặc lệnh nào khác. Ban đầu, lệnh này đã được thêm vào để thay đổi ký tự thoát để hỗ trợ Windows:

# escape=`

FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\

Dòng đầu tiên, trong khi nó có vẻ là một nhận xét, là một lệnh phân tích cú pháp để thay đổi ký tự thoát thành một backtick để các lệnh COPYRUNcó thể sử dụng dấu gạch chéo ngược trong đường dẫn. Một lệnh trình phân tích cú pháp cũng được sử dụng với BuildKit để thay đổi trình phân tích cú pháp frontend bằng một syntaxdòng. Xem cú pháp thử nghiệm để biết thêm chi tiết về cách sử dụng trong thực tế.

Với lệnh nhiều dòng, các dòng nhận xét sẽ bị bỏ qua, nhưng bạn cần nhận xét từng dòng riêng lẻ:

$ cat Dockerfile
FROM busybox:latest
RUN echo first command \
# && echo second command disabled \
 && echo third command

$ docker build .
Sending build context to Docker daemon  23.04kB
Step 1/2 : FROM busybox:latest
 ---> 59788edf1f3e
Step 2/2 : RUN echo first command  && echo third command
 ---> Running in b1177e7b563d
first command
third command
Removing intermediate container b1177e7b563d
 ---> 5442cfe321ac
Successfully built 5442cfe321ac

3
+1 để đề cập "phải ở đầu dòng" . Điều gì về tiếp tục dòng? Nếu một dòng bình luận kết thúc bằng \, dòng tiếp theo cũng sẽ là một bình luận chứ? Nói cách khác, nếu một lệnh nhiều dòng được nhận xét, tất cả các dòng cần phải bắt đầu bằng #hoặc chỉ dòng đầu tiên? Một thí nghiệm cho thấy nó là trước đây. Câu trả lời này có thể được cập nhật để bao gồm điều đó (làm cho nó thậm chí còn tuyệt vời hơn).
Peter Mortensen

1
@PeterMortensen Nhận xét là cần thiết trên mỗi dòng, docker hoàn toàn bỏ qua mọi thứ cho đến linefeed. Điều thú vị đối với tôi là lệnh nhiều dòng có thể trải rộng trên các bình luận.
BMitch

19

Sử dụng #cú pháp cho ý kiến

Từ: https://docs.docker.com/engine/reference/builder/#format

# My comment here
RUN echo 'we are running some cool things'

2
nhưng chúng ta có thể bình luận trên cùng một dòng như RUN, COPY, MAINTAINER, v.v. không?
Alexander Mills

@AlexanderMills Có theo các tài liệu tôi liên kết với nhận xét nội tuyến là hợp lệ ADD . $foo # ADD . /bar
edhurtig

2
Tuy nhiên, @AlexanderMills lưu ý rằng việc thay đổi nhận xét ở cuối dòng sẽ khiến docker chạy lại dòng đó trên bản dựng docker, vì "dòng đã thay đổi". Điều này có thể hữu ích và / hoặc gây phiền nhiễu
Phylliida

Điểm rất tốt, có lẽ docker nên bỏ qua bình luận lol
Alexander Mills

Đó vừa là một tính năng vừa là một lỗi, tôi đoán Docker sẽ coi đó là một tính năng và tôi nghĩ điều đó thực sự có ý nghĩa
Alexander Mills

4

Nhận xét Dockerfile bắt đầu bằng '#', giống như Python. Đây là một ví dụ tốt ( kstaken / dockerfile-example ):

# Install a more-up-to date version of MongoDB than what is included in the default Ubuntu repositories.

FROM ubuntu
MAINTAINER Kimbro Staken

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y install mongodb-10gen

#RUN echo "" >> /etc/mongodb.conf

CMD ["/usr/bin/mongod", "--config", "/etc/mongodb.conf"] 

Có, nhưng không giống như Python không phải là phần còn lại của dòng có lệnh ở đầu dòng? Bạn có thể muốn cập nhật câu trả lời của bạn.
Peter Mortensen

chỉ là một lưu ý: MAINTAINER không được dùng nữa, hiện được khuyên nên sử dụng nhãn:LABEL maintainer="foo@abc.com"
Alexei Martianov

3

Docker xử lý các dòng bắt đầu bằng # như một nhận xét, trừ khi dòng đó là một lệnh phân tích cú pháp hợp lệ. Dấu # ở bất kỳ nơi nào khác trong dòng được coi là đối số.

mã ví dụ:

# this line is a comment

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

Đầu ra:

we are running some # of cool things

2

định dạng

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

Chúng ta có thể sử dụng #cho mục đích bình luận #Commentchẳng hạn

#FROM microsoft/aspnetcore
FROM microsoft/dotnet
COPY /publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "WebApp.dll"]

Từ tệp trên khi chúng tôi xây dựng docker, nó bỏ qua dòng đầu tiên và đi đến dòng tiếp theo vì chúng tôi đã nhận xét nó bằng cách sử dụng #

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.