mysql - 从 bash 脚本运行 "mysql"命令

标签 mysql bash docker mariadb

我有一个 MariaDB Docker 容器,我想在 bash 脚本的帮助下自动访问它。

我正在使用 Docker 撰写:

version: '3'
services:
  drupal:
    image: jonasvbogaert/php-docker:${IMAGE_VERSION}
    container_name: drupalenv
    ports:
      - 8080:80
    volumes:
      - /var/www/html/
    restart: always
    environment:
      DRUPAL_SITE_NAME: Drupal
      DRUPAL_USER: admin
      DRUPAL_PASS: admin
  mariadb:
    image: mariadb:latest
    container_name: mariadbenv
    restart: always
    ports:
      - 3036:3036
    depends_on:
      - drupal
    environment:
      MYSQL_ROOT_PASSWORD: ""
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
      MYSQL_DATABASE: drupal`

第一个命令是潜入容器(工作正常):

docker exec -it mariadbenv bash

但是第二个:

mysql

输出以下错误:

错误 1045 (28000):用户“jonasvb”@“localhost”访问被拒绝(使用密码:NO) 输入设备不是 TTY

当我自己输入“mysql”时,它起作用了。

这是我使用的脚本:

function main () {
  getUserInput
}


function fireDocker () {
  if [ $DRUPAL_VERSION = "7" ]; then                            
    IMAGE_VERSION="drupal7"                                     
    export IMAGE_VERSION                                        
    docker-compose up -d                                         
    mountDump
  else
    IMAGE_VERSION="drupal8"                                     
    export IMAGE_VERSION                                        
    docker-compose up -d                                        
    mountDump
  fi
}

function getUserInput () {
  echo "Enter Drupal version (7 or 8)"
  read DRUPAL_VERSION                                           # Read 
  fireDocker $DRUPAL_VERSION
}

function mountDump(){
  docker exec -it mariadbenv bash
  mysql

}


main

编辑

当我执行不带 -t 标志的第一个命令时。 我有这个:enter image description here

并且保持这样。

最佳答案

您可以使用以下命令在容器中运行 mysql 命令

docker exec -i some_mysql_container mysql --user=root --password=root  <<< "select database();"

此处的密码和用户名应与容器中使用的密码和用户名匹配。

在您的情况下,更好的方法是将所有转储放在主机中,然后将该主机目录映射到容器内的/docker-entrypoint-initdb.d。为了更好地理解所有转储是如何导入到容器中的,您可以查看官方 entrypoint.sh mariadb 的:最新

L170 及以上:

    for f in /docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)     echo "$0: running $f"; . "$f" ;;
            *.sql)    echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
            *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
            *)        echo "$0: ignoring $f" ;;
        esac
        echo
    done

这使用户能够将所有内容放入 /docker-entrypoint-initdb.d/ 中,然后

  • 从那里运行 bash 脚本
  • 运行sql脚本
  • 恢复存档数据库

关于mysql - 从 bash 脚本运行 "mysql"命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45857478/

相关文章:

java - 如何在 TABLE FORM 中显示来自不同表的列

php - concat 条件左连接事件记录 codeigniter

php - 将 BASH 关联数组传递给 PHP 脚本

bash - 如何使用bash命令输出没有冒号的日期

docker - 无法将 shell 放入 kubernetes 中的 citadel 容器中

docker - Raspberry-pi 上的 Nextcloud 安装因 docker compose 失败

java - 用 Java 编写数据库迁移器,内存问题(代码结构?)

c# - 如何在 asp.net mvc 中修复 404 'Resource cannot be found'

arrays - Bash Looping 2 Arrays with whitespaces in variables

docker - Docker 镜像可以使用哪些环境变量?