1

我在这样的代码中使用MySQL docker 映像和 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在容器中执行挂载的文件,但除了mysql --help输出er.output和退出代码之外什么都没有收到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.12, Docker version 17.12.1-ce, build 7390fc6, client docker==3.1.1, mysql inside container mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper

这里可能有什么问题?

4

1 回答 1

2

如果您在主机上并且想要使用<、 使用管道|或仅使用多个命令来提供一些脚本,&&那么您必须使用这个 bash 技巧来完成它,/bin/bash -c "some command以便它将整个命令作为一个整体传递给容器。

docker exec -it local-mysql /bin/bash -c "mysql -h localhost < /data/init.sql"
于 2018-03-18T07:31:50.473 回答