Как вывести многострочную строку в Dockerfile с помощью одной команды - PullRequest
0 голосов
/ 28 января 2019

Я хочу вывести следующий текст в Dockerfile:

  *****first row *****  
  *****second row *****    

Один из способов сделать это так:

cat > Dockerfile <<EOF
FROM alpine:latest
RUN echo '  *****first row *****  ' >> /home/myfile
RUN echo '  *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
EOF  

Но если у меня 100 строк, это займет времяпотому что он запускает каждую команду отдельно и делает ее как слой.

Другой способ такой:

FROM alpine:latest
RUN printf '  *****first row *****  \n  *****second row *****  \n' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

, но он мне не нравится, потому что он делает его менее читаемым, особенно если у вас 100 строк.

Интересно, есть ли способ сделать что-то подобное:

FROM alpine:latest
RUN echo '  *****first row *****  
            *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

Или есть способ использовать команду ARG для этого?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если у вас есть файл среднего размера, обычно его проще сохранить в отдельном файле и просто COPY в.

FROM alpine:latest
COPY myfile.txt /
CMD cat /myfile.txt

Это распространяется на команды ENTRYPOINT и CMDтоже.Вместо того, чтобы писать сложную команду оболочки (особенно как ENTRYPOINT), обычно проще написать отдельный скрипт оболочки.Если для вашего приложения было важно напечатать содержимое этого файла перед запуском основной операции, выполняемой контейнером, вы можете написать скрипт точки входа, например

#!/bin/sh
cat /myfile.txt
exec "$@"

, а затем файл Dockerfile

FROM alpine:latest
COPY myfile.txt entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["???"]

Это также дает вам возможность изменить файл во время выполнения (скажем, используя sed (1)) перед запуском основной программы, если ее фактическое содержимое должно зависеть от переменных среды или других данных времени выполнения.

0 голосов
/ 28 января 2019

Есть еще один вопрос, похожий на этот с решением: Как писать команды с несколькими строками в Dockerfile при сохранении новых строк?

Ответ на этот вопрос более конкретен вкак использовать многострочные строки в bash, а не как использовать Docker.

Следуя этому решению, вы можете выполнить то, что вы хотите сделать, как показано ниже:

RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile

Подробнее об этом ведущем знаке доллара здесь: Как ведущий знак доллара влияет на одиночныйкавычки в Bash?

Обратите внимание, что этот синтаксис опирается на команду запуска с использованием / bin / bash, а не / bin / sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...