Як зробити коментар у Dockerfile?


405

Я пишу Dockerfile. Чи можна коментувати цей файл?

Чи є у Докера варіант коментаря, який займає решту рядка і ігнорує його?

Відповіді:


514

Ви можете використовувати # як початок рядка для коментування рядка .

# Everything on this line is a comment

Примітка: # як коментар можна використовувати лише на початку рядка.


8
Отже, відповідь на друге питання "Чи є у Докера варіант коментаря, який займає решту рядка і ігнорує його?" , ні? " Докер обробляє рядки, які починаються з #, як коментар " .
Пітер Мортенсен

1
Чи можете ви оновити свою відповідь і зробити її всебічнішою / повною? Наприклад, відповідаючи на друге питання.
Пітер Мортенсен

7
Відповідь BMitch заповнює критичну інформацію, якої немає у цій відповіді.
Джонатан

99

Як уже згадували інші, коментарі посилаються на "a" #і тут задокументовані . Однак, на відміну від деяких мов, вони #повинні бути на початку рядка. Якщо вони трапляються частково через лінію, вони трактуються як аргумент і можуть спричинити несподівану поведінку.

# 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

Слід також зазначити, що нещодавно до Dockerfile були додані директиви парсерів, які мають той же синтаксис, що й коментар. Вони повинні з’являтися у верхній частині файлу, перед будь-якими іншими коментарями чи командами. Спочатку ця директива була додана для зміни символу втечі для підтримки Windows:

# escape=`

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

Перший рядок, хоча це, здається, є коментарем, - це директива парсера щодо зміни символу евакуації на backtick, щоб команди COPYта RUNкоманди могли використовувати зворотну косу рису шляху. Директива аналізатора також використовується з BuildKit для зміни аналізатора фронтенда за допомогою syntaxрядка. Детальнішу інформацію про те, як це використовується на практиці, див. У експериментальному синтаксисі .

При багаторядковій команді коментовані рядки ігноруються, але потрібно коментувати кожен рядок окремо:

$ 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 для згадування "має бути на початку рядка" . А як щодо продовження лінії? Якщо рядок коментарів закінчується на \, чи наступний рядок також буде коментарем? Іншими словами, якщо коментовану команду з кількох рядків потрібно було б починати з #першого рядка чи тільки з першого рядка? Експеримент говорить про те, що це перший. Цю відповідь можна було б оновити, щоб охопити і це (зробивши це ще приголомшливішим).
Пітер Мортенсен

1
@PeterMortensen Коментар потрібен для кожного рядка, докер повністю ігнорує все, аж до передачі рядків. Що мені цікаво, це те, що багаторядкова команда може охоплювати коментарі.
BMitch

19

Використовуйте #синтаксис для коментарів

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

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

2
але чи можемо ми прокоментувати той самий рядок, як RUN, COPY, MAINTAINER тощо?
Олександр Міллз

@AlexanderMills Так, згідно з документами, які я посилався на вбудовані коментарі, дійсні ADD . $foo # ADD . /bar
edhurtig

2
@AlexanderMills зауважимо, однак, що зміна коментаря в кінці рядка призведе до того, що докер перезапустить цю лінію в докерній збірці, оскільки "рядок змінився". Це може бути корисно та / або дратувати
Філліда

Дуже вдалий момент, можливо, докер повинен проігнорувати коментар lol
Олександр Міллз

Це і особливість, і помилка, я думаю, що Докер вважатиме це функцією, і я думаю, що це має сенс насправді
Олександр Міллз

4

Коментарі в Dockerfile починаються з "#", як і Python. Ось хороший приклад ( kstaken / dockerfile-прикладів ):

# 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"] 

Так, але на відміну від Python це не інша частина рядка з командою на початку рядка? Ви можете оновити свою відповідь.
Пітер Мортенсен

лише зауваження: MAINTAINER застаріло, тепер рекомендується використовувати мітки:LABEL maintainer="foo@abc.com"
Олексій Мартьянов

2

Формат

Ось формат Dockerfile:

Наприклад, ми можемо використовувати #для цілей коментування#Comment

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

З наведеного вище файлу, коли ми будуємо докер, він пропускає перший рядок і переходить до наступного рядка, тому що ми прокоментували його за допомогою #


2

Докер розглядає рядки, які починаються з #, як коментар, якщо тільки рядок не є дійсною директивою розбору. Маркер # в будь-якому іншому рядку трактується як аргумент.

приклад:

# this line is a comment

RUN echo 'we are running some # of cool things'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.