我正在容器化公司现有产品的过程中,并将MySQL数据库分离到另一个容器中。为了访问主容器中的MySQL服务器,我在./bashrc中创建了一个别名,以便于命令是:
mysql ...
它实际上运行以下命令:
docker exec -it ${MYSQL_CONTAINER} mysql ...
但是,如果命令包含左三角形以添加文件,例如:
mysql < test.sql
我有一个别名来复制文件并运行它,但是主容器所在的bash读取左三角形作为一个独立的组件,而不是参数列表的一部分。
如何使别名以左三角形作为参数的一部分?由于现有的外部软件会在脚本中运行该命令,因此我无法在引号中加上“ function mysql() {
$1
$2
$3
$4
if [[ $1 == "--defaults-file=my.cnf" ]] && [[ ! $2 ]]; then
docker exec -it ${MYSQL_CONTAINER} mysql $1
elif [[ $1 == "--defaults-file=my.cnf" ]] && [[ $2 = "<" ]]; then
#docker cp $3 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
#docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 docker-entrypoint-initdb.d/$3"
elif [[ $1 == "-uroot" ]] && [[ ! $3 ]]; then
docker exec -it ${MYSQL_CONTAINER} mysql $1 $2
elif [[ $1 == "-uroot" ]] && [[ $3 = "<" ]]; then
docker cp $4 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 $3 docker-entrypoint-initdb.d/$4"
else
docker exec -it ${MYSQL_CONTAINER} mysql $1
fi
}
答案 0 :(得分:0)
您需要引号或转义<
字符,否则它会由原始Shell作为输入重定向操作符进行处理:
mysql '<' test.sql
然后将<
从字面上传递给您的函数,并将其传递给docker
。
答案 1 :(得分:0)
如果有人来这里寻找答案,我发现了解决问题的方法。我一直在寻找一种使命令行在使用别名时忽略stdin的方法,但是由于这似乎不太可能,所以我研究了如何使用它。
我试图从另一个与我的主机上的Docker守护进程连接的容器接触一个MySQL容器,并且可以运行docker命令。为了这个项目,我无法编辑现有命令,因此即使MySQL服务器存在于另一个容器中,我也必须使主容器使用mysql命令,所以我不得不四处玩耍。
function mysql() {
$1
$2
if [[ $1 == "--defaults-file=my.cnf" ]]; then
if [ -t 0 ]; then
docker exec -it ${MYSQL_CONTAINER} mysql $1
else
cat > new_adapter.sql
cat new_adapter.sql
docker cp new_adapter.sql $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 < docker-entrypoint-initdb.d/new_adapter.sql"
rm -rf new_adapter.sql
fi
fi
}
在主容器上有一个.sql文件时,我不能简单地“