python docker 客户端没有以正确的方式执行 mysql 命令

python docker client does not execute mysql command in a right way

我在这样的代码中使用 MySQL docker image 和 docker python 客户端

import docker

client = docker.from_env()
container_name = 'local-mysql'

path_to_current_dir = '/home/user/workspace'

container = client.containers.run(
    'mysql',
    name=container_name,
    auto_remove=True,
    environment={
        'MYSQL_ALLOW_EMPTY_PASSWORD': True,
    },
    detach=True,
    volumes={
        path_to_current_dir: {'bind': '/data/', 'mode': 'ro'},
    }
)

er = container.exec_run('mysql -h localhost < /data/init.sql')

基本上我只想在容器中执行挂载的 *.sql 文件,但在 er.output 中只收到 mysql --help 输出,退出代码是 1。 运行 docker exec -it local-mysql bash 和手动执行 mysql -h localhost < /data/init.sql 完美无缺。提供 tty=True 参数也无济于事。

这是我的 init.sql 文件的内容

CREATE DATABASE my_test;


CREATE TABLE `test_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `text` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我怀疑我的命令有问题(不是按照 docker 客户接受的方式形成的?)。这是我的环境以获取更多详细信息: Python 2.7.12Docker version 17.12.1-ce, build 7390fc6、容器 mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper 中的客户端 docker==3.1.1、mysql。

这里可能有什么问题?

如果你在主机上并且想用 < 提供一些脚本,使用管道 | 或只是多个命令 && 你必须用这个 bash trick /bin/bash -c "some command 所以它将整个命令作为一个整体传递给容器。

docker exec -it local-mysql /bin/bash -c "mysql -h localhost < /data/init.sql"