使用Bash能否在容器内执行命令?Podman执行MySQL命令报错求助
解决Podman容器内执行MySQL命令的问题
问题1:修正Here Doc脚本的错误
你的脚本存在两个核心问题:
- 误用
-it参数:podman exec -it用于交互式终端场景,通过Here Doc传递命令属于非交互式操作,保留该参数会触发EOF错误。 - MySQL密码语法错误:
IDENTIFIED BY /'$1/'写法完全错误,正确格式是用单引号包裹密码,即IDENTIFIED BY '$1'。
修正后的脚本:
#!/bin/sh # 创建Mautic所需的数据库和用户 podman exec postal-mariadb mysql -h 127.0.0.1 -u root -p"$1" <<EOF CREATE DATABASE IF NOT EXISTS mauticdb; CREATE USER IF NOT EXISTS 'mautic'@'%' IDENTIFIED BY '$1'; GRANT ALL PRIVILEGES ON mauticdb.* TO 'mautic'@'%'; FLUSH PRIVILEGES; EOF
补充说明:
- 加入
IF NOT EXISTS避免重复执行脚本时报错 - 指定
@'%'允许Mautic从任意地址连接数据库(仅需本地连接可改为@'localhost') - 移除
exit,Here Doc执行完成后MySQL会自动退出
问题2:修正管道执行查询命令的错误
同样需要去掉-it参数,同时调整密码传递方式:
方式1:直接在命令行指定密码(推荐,避免管道潜在问题)
podman exec postal-mariadb mysql -h 127.0.0.1 -u root -p"$1" postal-server-1 -e 'select * from deliveries limit 10;'
方式2:通过管道传递密码(适合密码需从其他命令获取的场景)
echo "$1" | podman exec postal-mariadb mysql -h 127.0.0.1 -u root -p postal-server-1 -e 'select * from deliveries limit 10;'
补充说明:
- 此方式下
-p后不要直接写密码,MySQL会自动从标准输入读取密码 - 必须移除
-it,否则终端交互会干扰管道输入
关键注意事项
- 生产环境避免明文传密码:建议用MySQL的
--defaults-extra-file参数加载包含密码的配置文件,防止密码暴露在命令行历史中。 - 特殊字符处理:若密码包含空格、引号等特殊字符,必须用双引号包裹
"$1",确保变量被正确解析。
内容的提问来源于stack exchange,提问作者rnd om
相关产品推荐
相关产品推荐

