You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:54:42