This answer很有见地,但我仍然在苦苦挣扎。
我想要的是创建一个别名,我可以使用它来备份docker容器中的mysql数据库。
在这种情况下,Container名称是工作目录和文本字符串的连接:directory_name_1
。
我想要运行的命令(github gist)是这样的:
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
将备份文件放在工作目录中。
我试过了
alias dumpdb='docker exec `pwd`_my-string mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
的变化
alias WORKING_DIR="pwd | rev | cut -d "/" -f1 | rev"
alias DOCKER_CONTAINER='echo $(WORKING_DIR)_my-wpdb_1'
alias dumpdb='docker exec $(DOCKER_CONTAINER) mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
但是我仍然在码头里闲逛。有人会这么善良地指导我吗?
答案 0 :(得分:1)
一个好的解决方案是使用函数(而不是别名)。
<强>为什么吗 因为别名应该仅用于简单的修改(比如在命令中添加额外的参数/标志)。
因此,我们可以创建一个函数,也可以创建一个shellcript。在我们的例子中,因为这是一个非常简单的问题,我们可以创建一个函数。
你应该在.bash_profile
上写下来因此,例如,您可能尝试定义以下函数
function dumpdb()
{
local wkdir="basename $(pwd)"
local container="${wkdir}_my-wpdb_1"
docker exec ${container} mysqldump -uroot --password=password DATABASE > backup.sql
}
写完之后,重新加载bash_profile(使用源.bash_profile或创建一个新会话),你就可以在控制台上执行dumpdb,就像它是一个别名一样。
答案 1 :(得分:1)
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql
}
或者,作为别名:
alias dumpdb='docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql'
通过使用函数,您可以将数据库名称传递给它,例如:
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password "$1" >backup.sql
}
dumpdb "my_database"
${PWD##*/}
将扩展为父工作目录的基本名称;如果$PWD
为/home/user/stuff
,则${PWD##*/}
将为stuff
。
如果您没有为重定向到的文件指定目录名,则该文件将以当前工作目录结束,因此不需要使用pwd
。
答案 2 :(得分:1)
我的评论没有足够的声誉,而Kusalananda的回答很完美。
对于任何需要更通用解决方案的人来说,这对于Kusalananda的答案来说都是一个小调整。
dumpdb () {
docker exec "$1" \
mysqldump -uroot --password=secret "$2" > sql/dump.sql
}
这样,您可以传递2个参数。一个用于容器,一个用于数据库名称。
您可以简单地调用该函数: dumpdb example_container_1数据库
如果要提供其他参数,只需输入$ 3,$ 4等,然后调用函数dumpdb arg1 arg2 arg3 arg4等