如何编写bash脚本与docker容器内的mysql数据库交互

kcugc4gi  于 2023-04-20  发布在  Docker
关注(0)|答案(2)|浏览(144)

我有一个PrestaShop数据库在一个docker容器中运行,我打算back up.事情是,我需要在运行它之前将电子商务商店置于维护模式.理想情况下,我打算在远程机器上运行该脚本让它通过ssh登录,然后与容器交互(通过脚本),但似乎我可能(首先)需要通过ssh登录,然后在服务器上运行脚本?(因为它启动了一个新的shell等)。
这些是我目前为止的脚本部分,但我不确定如何在mysql中将它们组合成字符串命令:

#!/bin/bash

# Log in to docker@debVM server via SSH
ssh docker@debVM

# Run the following Docker Container
docker exec -it ps1-7-mariadb-1 /bin/bash

# Login to the database bitnami_prestashop 
mysql -u bn_prestashop -pbitnamiUSER bitnami_prestashop

# Run update - store into maintenance mode
UPDATE ps_configuration SET value='0' WHERE name='PS_SHOP_ENABLE'; 

#Exit the mysql and docker exec
Exit 

#run the backup-volumes-container.sh script
echo running the backup-volumes-container.sh script
cd
cd scripts/
./backup-volumes-container.sh ps1-7-mariadb-1 
./backup-volumes-container.sh ps1-7-prestashop-1
echo Backup-volumes complete

希望有人能帮忙-谢谢!

sg2wtvxw

sg2wtvxw1#

shell脚本是一系列shell命令,它们可能与您在终端中键入的命令不同。然后,当完成时,它(本地)运行docker exec;然后,当完成时,它(本地,在容器外部)运行mysql;原则上,您可以使用管道语法为命令提供输入,但当您逐步深入到几个层时,这会变得复杂。
一些命令可以将其内部命令作为命令行参数提供。例如,mysql -e 'SELECT ...'将运行单个SQL调用,或docker exec container-name command arg1将运行单个命令。
但是:我认为您可以完全在本地运行它,根本不需要任何嵌套命令或docker exec
您需要做的一点设置是使数据库可以从容器外部访问。

docker run -p 127.0.0.1:12345:3306 ... mysql

如果你使用Compose,它的ports:有相同的语法。如果你删除前面的127.0.0.1,容器将完全可以通过网络访问,我猜你不想这样。12345可以是任何没有使用的端口号,但最后一个数字必须是3306以匹配标准数据库端口。
完成此操作后,在目标系统上,您现在可以直接从主机访问主机127.0.0.1端口12345上的数据库,而无需使用Docker工具。(请记住,IP地址是非常特定于上下文的,它在本地系统、远程系统和容器中的含义不同。)
您可以类似地使用ssh来设置端口转发:

ssh -L 127.0.0.1:23456:127.0.0.1:12345 -f -N docker@debVM

同样,23456是任何其他未使用的本地端口,12345与上面的12345匹配。现在,本地系统上的端口23456转发到远程系统中的端口12345,远程系统转发到容器中的端口3306
通过此设置,现在可以直接在本地运行mysql

mysql \
  -h 127.0.0.1 -p 23456 \
  -u bn_prestashop -pbitnamiUSER \
  -e "UPDATE ps_configuration SET value='0' WHERE name='PS_SHOP_ENABLE';" \
  bitnami_prestashop

类似地,在本地运行备份脚本,指向端口转发的数据库连接。

f4t66c6m

f4t66c6m2#

如果你的目标是在你的docker容器中的操作系统上运行命令,请查看docker exec。你可以在你的容器的dockerfile中安装一个mysql客户端,然后像在主机上一样通过docker exec使用它。
如果需要从容器中获取数据,可以将日志文件或其他文件Map到容器中作为文件卷,并让容器将输出写入该文件。
这里有一个例子,我正在谈论的here

相关问题