Как выполнить команду mysql с использованием подпроцесса python внутри контейнера докеров

У меня есть скрипт python, который выполняет операции с mysql db, используя подпроцесс модуля python. Я новичок в докере и пытаюсь запустить этот код с помощью докера. Я создал файл docker compose для запуска контейнера для моего скрипта python и контейнера для моей mysql db. Объект MySQLConnection из модуля mysql-connector работает нормально, но я хотел бы использовать модуль подпроцесса для выполнения операции mysql в контейнере mysql. Как я могу это сделать?

Это работает:

db = MySQLConnection(host = "mysql-container", user = "root", password = "secret")
cursor = db.cursor()
cursor.execute("SHOW SCHEMAS")
data = cursor.fetchone()

Это дает ошибку: «[Errno 2] Нет такого файла или каталога: 'mysql': 'mysql'».

p = subprocess.Popen(["mysql", "-h", "mysql-container", "-P", "3306", "-u", "root", "-psecret"],
                     stdout=subprocess.PIPE, stdin=subprocess.PIPE)
p.communicate("source sql_file.sql")

у вас установлен клиент mysql на хост-машине?

Marat 20.03.2018 18:49

Ах, спасибо за понимание! Я ошибочно установил клиент mysql на хост-контейнер. Сейчас он работает.

Jos van den Berg 20.03.2018 19:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, как оказалось, на хост-машине отсутствовал клиент mysql.

Однако в целом ненужное раскрытие контейнерных портов не является хорошей практикой. Вместо этого я бы подумал о запуске команд внутри контейнера, например:

docker exec -t container_name bash -c "echo mysql_command | mysql [params]"

Другие вопросы по теме