#bash #docker
#bash #docker
Вопрос:
Для контекста я пытаюсь создать образ docker для базы данных MySQL, в которую я могу войти без использования пароля. Я читаю статью о том, как это сделать, но для этого мне нужно обновить my.cnf в контейнере с учетными данными, которые мне нужны, чтобы избежать необходимости ввода пароля.
Одна из моих идей заключалась в том, чтобы получить шаблонную версию файла my.cnf, поместить его в обычный текстовый файл, обновить его с помощью необходимых мне учетных данных и скопировать его в контейнер. Но я все еще не знаю достаточно команд BASH, чтобы брать текст из одного файла и перезаписывать другой. Я открыт даже для простых указаний на то, как я мог бы сделать это с помощью команд ванильной оболочки. Надеюсь, это может помочь кому-то еще опубликовать этот вопрос.
Вот что изначально нравится локальным пользователям my.cnf
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Мне нужно обновить его, чтобы иметь что-то вроде этого. В этом фрагменте есть строки пользователя и пароля.
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[MySQL]
user=root
password=supersecret
Комментарии:
1. Вы просите рассказать о существовании
sed
илиawk
?2. Я думаю, да. Я посмотрю, что делают эти команды
3. Если кто-то не опередит меня. Я опубликую хороший ответ для следующего пользователя. Спасибо за указатель @jeremysprofile
4. Или… Вы просите рассказать о существовании документов Here ?
5.
ed
очень удобно для редактирования файлов в сценариях оболочки.
Ответ №1:
Поскольку изменения, которые вы хотите внести, просто состоят из добавления в конец файла, вы можете использовать перенаправление вывода с >>
для добавления в файл. Любое из следующих действий должно работать. Вот пример использования оболочки «here-document»:
cat >>.my.cnf <<'EOF'
[MySQL]
user=root
password=supersecret
EOF
Или вы могли бы использовать три отдельных echo
s:
echo '[MySQL]' >>.my.cnf
echo 'user=root' >>.my.cnf
echo 'password=supersecret' >>.my.cnf
Или один printf
:
printf '%sn' '[MySQL]' 'user=root' 'password=supersecret' >>.my.cnf
Обратите внимание, что если ваш пароль содержит одинарную кавычку, ему потребуется несколько более сложная обработка в echo
printf
случаях или (потому что вы не можете включить одинарную кавычку в строку, заключенную в одинарные кавычки).
Ответ №2:
Находясь в соответствующем каталоге, я могу запустить это.
awk '1; END {print "[mysql]"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf amp;amp; awk '1; END {print "user=root"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf amp;amp; awk '1; END {print "password=supersecret"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf
Это был отличный ресурс, чтобы узнать, как это работает https://www.cyberciti.biz/faq/bash-scripting-using-awk /
Вот основная схема
awk '1; END {print "text to add"}' file > tmp amp;amp; mv tmp file
для любого файла, который вы укажете, он добавит текст для добавления в нижнюю часть
Комментарии:
1. если вы просто хотите добавить 3 строки в конец файла (согласно последнему редактированию вопроса):
printf "[mysql]nuser=rootnpassword=supersecretn" >> .my.cnf
; предыдущие комментарии оawk
иsed
все равно будут применяться, если предполагается добавить строки где-нибудь в «середине» файла (в соответствии с первоначальными требованиями вопроса)