【问题标题】:Why does a python-on-whales docker mysql command not work, but issuing the command in the shell does为什么 python-on-whales docker mysql 命令不起作用,但在 shell 中发出命令却可以
【发布时间】:2022-01-14 17:30:50
【问题描述】:

我正在使用 python-on-whales 在 mysql docker conatiner 中运行 mysql 命令。

我使用docker.execute从python脚本调用容器内的命令,它返回一个错误:


import mysql.connector
import os
from mysql.connector.errors import DatabaseError
from python_on_whales import docker

envs={"MYSQL_ROOT_PASSWORD":"TempPassword",
              "MYSQL_USER":"root",
              "MYSQL_ROOT_PASSWORD":"TempPassword"
                }
#Start the mysql container       
docker.run("mysql/mysql-server",name="test_mysql",
                    envs=envs,
                    publish=[(3306,3306)],
                    detach=True)
#copy scripts to container
docker.copy("./permissions.mysql","test_mysql:/etc/") 
docker.copy("./permissions.sh","test_mysql:/etc/")
#try calling permissions.sh on the container
docker.execute("test_mysql", ["/etc/permissions.sh"])

这产生了以下错误:

    result = run(full_cmd, tty=tty)
  File "/usr/local/lib/python3.9/site-packages/python_on_whales/utils.py", line 150, in run
    raise DockerException(
python_on_whales.exceptions.DockerException: The docker command executed was `/usr/local/bin/docker exec test_mysql /etc/permissions.sh`.
It returned with code 1
The content of stdout is ''
The content of stderr is 'mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

在错误 python-on-whales 报告它调用的命令:

/usr/local/bin/docker exec test_mysql /etc/permissions.sh

但是,如果我直接在 bash shell 中发出从 python-on-whales 报告的命令,而不是使用 python-on-whales 命令执行。

谁能解释一下原因?

【问题讨论】:

  • 如果您使用docker run -p ...:3306 选项启动数据库以将数据库端口发布到主机,则您不需要在此处执行任何特定于 Docker 的操作。使用普通的 MySQL 客户端库连接到该发布的端口。
  • python-on-whales 的docker.run(...) 命令本质上是在调用docker run -p

标签: python mysql bash docker python-on-whales


【解决方案1】:

意识到了这个问题。

python_on_whales 在尝试运行脚本之前不会自动等待带有服务器的容器启动 - 这是我问题的根源。我不再需要运行脚本,因为它的作用(允许我从容器外部访问服务器)可以通过连接设置的正确参数来处理:

        #set up test server and database:
        envs={"MYSQL_ROOT_PASSWORD":"TempPassword",
              "MYSQL_ROOT_HOST":"%",
              "MYSQL_USER":"root",
                }

但是 python_on_whales 没有等待在我的代码中导致了其他一些问题。因此,对于任何可能对您有用的人都可以执行类似的操作,直到连接返回 True,如下所示:

        not_connected=True
        while not_connected:
            try:
                connection=mysql.connector.connect(**config)
                if connection.is_connected():
                    not_connected=False
            except:
                time.sleep(1)
                pass

【讨论】: