У меня есть рецепт, который настраивает экземпляр докера с определенным образом mysql, который я создал для своего приложения. В рамках этого рецепта я хотел бы, чтобы после того, как контейнер запускал mysql, процедура восстановления данных из резервной копии начиналась автоматически.
Для этого мне нужен IP-адрес контейнера (или способ получить его из DNS). Однако, поскольку я автоматически вызываю контейнер из рецепта, у меня нет возможности узнать, каким будет этот IP-адрес, поэтому я пытаюсь настроить докер с именем хоста, которое он может позже разрешить.
Как ни странно, если я свяжу один контейнер с другим, я смогу разрешить хост другого контейнера из связанного с ним. Но я не нашел способа разрешить это имя хоста от хоста.
Вот часть рецепта (повар), которую я использую, чтобы поднять контейнер:
docker_container 'imhere-mysql' do
hostname mysqlHost
repo 'lutraman/imhere'
tag 'mysql'
env ["MYSQL_ROOT_PASSWORD=#{mysql_password}"]
volumes [ '/var/imhere/mysql:/var/lib/mysql' ]
action :run
end
Команда, которую я хотел бы использовать для восстановления данных, выглядит примерно так (построена по рецепту):
"gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"
только то, что запущено с хоста, имя в mysqlHost
(в данном случае - imhere-mysql
) не разрешается с хоста.
Внизу страницы есть примечание. этот статья, в которой говорится, что на 127.0.0.11 должен быть сервер docker dns, но я боюсь, что это внутреннее для контейнеров.
Я надеюсь, что смогу сделать, так это запросить докер (в идеальной ситуации, как DNS, но в любом случае будет работать) для ip контейнера с именем imhere-mysql. Как лучше всего сделать это таким образом, чтобы он сохранялся в будущих версиях на докере и независимо от ОС хоста?
Вы можете получить IP-адрес контейнера, используя команду docker inspect с фильтром:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name>
Ваша команда будет:
"gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h $(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' #{mysqlHost}) -u root -p'#{mysql_password}'"
Также вы можете использовать статические ip-адреса для контейнеров, объявляя собственные сети.
Моим решением было бы запустить команды восстановления в контейнере в той же сети (или со ссылкой). Похоже, у вас уже есть доступная информация о папке, поэтому ее можно передать во временный контейнер в качестве тома.
Используя устаревшие ссылки Docker, это будет выглядеть примерно так:
docker run --link #{mysqlHost} --rm -v #{parent_data_dir}/#{db_restore_filename}:/tmp/dbrestore.sql lutraman/imhere bash -c "gunzip -c /tmp/dbrestore.sql | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"
Это будет использовать то же изображение (при условии, что mysql
и gunzip
доступны бинарные файлы и нет ENTRYPOINT
), чтобы смонтировать хост-том во временное место в контейнере, а затем разархивировать из этого временного места в mysql
бинарное подключение к ссылке.
Вероятно, вы могли бы избежать устаревшей ссылки, создав собственный сетевой мост Docker. В этом случае имена контейнеров в этой настраиваемой сети должны быть доступны через DNS без необходимости ссылки. Но это добавит к вашему рецепту дополнительных деталей, которые могут оказаться более трудоемкими, чем стоящими.