【问题标题】:mysql source command do nothing inside docker containermysql源命令在docker容器内什么都不做
【发布时间】:2023-03-18 21:23:01
【问题描述】:

说明

我正在运行带有 mysql 的 docker 容器,我想在 mysql 启动后运行 python 脚本,这将对其应用转储。

这是Dockerfile的sn-p:

FROM mysql:5.6

RUN apt-get update && \
    apt-get install -y python

ADD apply_dump.py /usr/local/bin/apply_dump.py
ADD starter.sh /usr/local/bin/starter.sh

CMD ["/usr/local/bin/starter.sh"]

starter.sh

nohup python '/usr/local/bin/apply_dump.py' &
mysqld

apply_dump.py

import os
import urllib
import gzip
import shutil
import subprocess
import time
import logging
import sys

# wait for mysql server
time.sleep(5)
print "Start dumping"

dumpName = "ggg.sql"
dumpGzFile = dumpName + ".gz"
dumpSqlFile = dumpName + ".sql"

print "Loading dump {}...".format(dumpGzFile)
urllib.urlretrieve('ftp://ftpUser:ftpPassword@ftpHost/' + dumpGzFile, '/tmp/' + dumpGzFile)

print "Extracting dump..."
with gzip.open('/tmp/' + dumpGzFile, 'rb') as f_in:
    with open('/tmp/' + dumpSqlFile, 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

        print "Dropping database..."
        subprocess.call(["mysql", "-u", "root", "-proot", "-e", "drop database if exists test_db"])

        print "Creating database..."
        subprocess.call(["mysql", "-u", "root", "-proot", "-e", "create schema test_db"])

        print "Applying dump..."
        subprocess.call(["mysql", "--user=root", "--password=root", "test_db", "-e" "source /tmp/{}".format(dumpSqlFile)])
        print "Done"

ggg.sql.gz 的内容非常简单:

CREATE TABLE test_table (id INT NOT NULL,PRIMARY KEY (id));

问题

已创建数据库,但未创建表。如果我将转到容器并手动运行此脚本,则会创建表。如果我将 source 命令替换为直接的 sql create 语句,它也可以正常工作。但实际上转储文件会非常大,只有source 命令才能处理这个问题(或者不仅仅是它?)。我是不是做错了什么?

提前致谢。

【问题讨论】:

  • 我相信问题出在您的 starter.sh 脚本中。您正在运行在 MySQL 服务启动之前将数据插入 MySQL 的 python 脚本。我猜subprocess.call() 调用实际上是失败的。您是否检查过它们的返回值(退出代码)。除零以外的任何内容都表示您正在调用的 mysql 二进制文件返回失败。数据库是作为 MySQL docker 镜像的一部分创建的,这可能就是为什么即使表不存在也存在的原因。
  • 我认为情况并非如此,因为架构删除和创建工作正常。

标签: python mysql docker


【解决方案1】:

尝试像这样将源 SQL 文件传递​​给 MySQL 命令,而不是使用 -e 标志:

subprocess.call(["mysql", "--user=root", "--password=root", "test_db", "<", "/tmp/%s" % dumpSqlFile])

这将调用使用广泛使用的语法导入您的 SQL 文件:

mysql --user=root --password=root test_db &lt; /tmp/source.sql

【讨论】:

  • 在这种情况下,我会从 mysql 收到这样的帮助消息gist.github.com/skrauchenia/e747efc3626c3cb5e6f6be6cee263b4b
  • 查看我修改后的python代码。它很可能是由于 subprocess.call() 方法转义了 &lt; 符号而失败。
  • 感谢您的回答。您是否尝试执行此代码?有效果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2017-03-22
  • 1970-01-01
  • 2021-09-16
  • 2014-11-17
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多