【问题标题】:docker-compose mysql import failed - the input device is not a TTYdocker-compose mysql 导入失败 - 输入设备不是 TTY
【发布时间】:2018-05-25 11:47:58
【问题描述】:

我有任何正在运行的容器。所以我需要导入 sql 数据库并尝试

docker-compose exec MYSQL_CONTAINERNAME mysql -uroot -p --database=MY_DB < /code/export_new.sql

但我有消息“docker-compose exec -i MYSQL_CONTAINER NAME mysql -uroot -p --database=MY_DB

Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

Options:
    -d, --detach      Detached mode: Run command in the background.
    --privileged      Give extended privileges to the process.
    -u, --user USER   Run the command as this user.
    -T                Disable pseudo-tty allocation. By default `docker-compose exec`
                      allocates a TTY.
    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]
    -e, --env KEY=VAL Set environment variables (can be used multiple times,
                      not supported in API < 1.25)
    -w, --workdir DIR Path to workdir directory for this command.

如何将我的“export_new.sql”导入到容器中的 mysql 中?

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    为我工作

    docker-compose exec -T MYSQL_CONTAINERNAME mysql databasename < data.sql
    

    【讨论】:

    • 最佳解决方案 imo,-T 选项就像一个魅力。
    • 这把我扔了ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    • 您可能需要像原始问题“-p”一样为您的用户使用密码,这实际上取决于您的数据库配置。 -T 选项仅适用于“输入设备不是 TTY”,而不是其他任何东西,希望对您有所帮助!
    【解决方案2】:

    像这样使用docker-compose exec 不起作用(不知道为什么),但您可以使用docker exec。您只需要知道容器名称或 ID。名称列在docker-compose up 中,或者您可以使用docker-compose ps 查找。

    这是一个示例命令:

    docker exec -i MYSQL_CONTAINERNAME mysql databasename < data.sql
    

    或者您可以将docker-compose ps 组合到其中,这样您只需要知道短名称(在docker-compose.yml 中定义):

    docker exec -i $(docker-compose ps -q MYSQL) mysql databasename < data.sql
    

    另外,请注意,我在使用带有 -p 标志的上述命令时遇到了问题,因此它会以交互方式要求输入密码,但是当我在初始命令中传递密码时(例如 mysql -uroot -pmypwd),它可以工作。

    【讨论】:

      【解决方案3】:

      好的,首先您必须连接到正在运行的 mysql 实例。你可以用这个命令来做:

      docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
      

      在此命令中,将字符串some-mysql 更改为您实际容器的名称。变量对应:

      • MYSQL_PORT_3306_TCP_ADDR - 主机(默认:本地主机)
      • MYSQL_PORT_3306_TCP_PORT - 端口(默认:3306)
      • MYSQL_ENV_MYSQL_ROOT_PASSWORD - root 用户的密码

      然后你就可以直接在你的mysql实例上执行命令了,输入就足够了:

      MY_DB < /code/export_new.sql
      

      对于任何故障排除或良好的信息来源,请在此处阅读有关 mysql docker 映像的信息: https://hub.docker.com/_/mysql/

      【讨论】:

        【解决方案4】:

        如果你的 docker DBMS 有密码,你应该使用:

        docker exec -i MYSQL_CONTAINERNAME mysql databasename_optional -ppassword < data.sql
        

        databasename_optional 是可选的,因为某些 DB Dump 会在其顶部设置 DB 名称,例如:

        CREATE DATABASE IF NOT EXISTS `databasename` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
        USE `databasename`;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-18
          • 2021-12-16
          • 2018-04-12
          • 2017-08-23
          • 2021-04-06
          • 2017-06-27
          • 2016-08-05
          相关资源
          最近更新 更多