mysql源命令在docker容器内部不起作用

2024-04-25 13:11:47 发布

您现在位置:Python中文网/ 问答频道 /正文

说明

我运行的是docker container,里面有mysql,我想在mysql启动后运行python脚本,在上面应用dump。在

以下是Dockerfile的一个片段:

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"]

起动机.sh

^{pr2}$

应用_转储.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命令可以处理这个问题(或者不仅仅是它?)。我做错什么了吗?在

提前谢谢。在


Tags: pytestimportsqlbinusrlocalsh
1条回答
网友
1楼 · 发布于 2024-04-25 13:11:47

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

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

这将使用广泛使用的语法调用import your SQL file:

mysql user=root password=root test_db < /tmp/source.sql

相关问题 更多 >