【发布时间】:2021-04-30 07:55:03
【问题描述】:
我想要一个命令,首先创建一个 docker 容器,然后在我的数据库上执行一个 sql 命令,然后在完成后删除容器。
目前我有这个 Dockerfile:
FROM ubuntu:18.04
# copy database-file.sh
WORKDIR /database-file
RUN mkdir database-file
COPY * /database-file/
# Update and install mysql-client
RUN apt-get update && apt-get -y install mysql-client
# Prepare database-prepare script to be use
RUN chmod +x ./database-prepare.sh
VOLUME /app/log
# Exec my script
ENTRYPOINT ["./database-prepare.sh"]
我拍了一张 Ubuntu 映像,我不知道它是否是最好的,但就目前而言,我认为还可以。我只是想测试一下。
所以这是我的脚本:
### Global ./database-prepare.sh ###
#!/bin/bash
# Get service name by Docker secret.
service=$(cat /run/secrets/<society_name>_DATABASE_PREPARE__SERVICE)
# Format the service name.
serviceName=${service//./-}
# Clone the repo of my service
git clone --recurse-submodules git@bitbucket.org:<society_name>/<society_name>.binding.$service.git /$serviceName
# CD in the right folder
cd /$serviceName/build/
# Prepare my script and execute it
chmod +x database-prepare.sh
./database-prepare.sh
然后每个服务都有自己的 database-prepapre.sh,它将在我的数据库中创建一个新用户:
### Service ./database-prepare.sh ###
#!/bin/bash
# Get password with Docker secret
<society_name>_MSQL_ROOT_PWD=$(cat /run/secrets/<society_name>_MYSQL_PWD) # My Mysql password
<society_name>_BINDING_ABEEWAY_GENERIC_DBS__<society_name>_DATA__PWD=$(cat /run/secrets/<society_name>_BINDING_ABEEWAY_GENERIC_DBS__<society_name>_DATA__PWD) # My password for this user
mysql -h <society_name>-sql-server.mysql.database.azure.com --user='administrateur@<society_name>-sql-server' --ssl --password=$<society_name>_MYSQL_ROOT_PWD << EOF
DROP USER IF EXISTS '<society_name>.binding.abeeway.generic'@'%';
CREATE USER '<society_name>.binding.abeeway.generic'@'%' IDENTIFIED BY '$<society_name>_BINDING_ABEEWAY_GENERIC_DBS__<society_name>_DATA__PWD';
GRANT SELECT, INSERT ON <society_name>_data.ms_gpsposition TO '<society_name>.binding.abeeway.generic'@'%';
GRANT SELECT, INSERT ON <society_name>_data.ms_log TO '<society_name>.binding.abeeway.generic'@'%';
GRANT SELECT, INSERT ON <society_name>_data.ms_temperature TO '<society_name>.binding.abeeway.generic'@'%';
EOF
知道这是我的问题:
./database-prepare.sh: line 6: unexpected EOF while looking for matching `"'
./database-prepare.sh: line 13: syntax error: unexpected end of file
所以我的错误出现在我的服务文件中,其中有“文件结束”文本。我尝试直接在正在运行的容器中执行此代码,并且 EOF 没有问题......我真的不知道我在哪里犯了错误,我是 Dockerfile 的新手,我认为我的错误可能是由我拍摄的图像引起的,或者我可能忘记安装一个有用的工具来使我的脚本正常工作。或者只是我的剧本不好..我不知道。
我希望您有足够的信息来帮助我,如果您需要更多信息,请告诉我。 非常感谢!
Ps:如果你知道他执行命令后如何删除我的服务,我将不胜感激!我在 swarm 集群上工作
【问题讨论】:
-
引用你的变量。密码可能包含空格、引号或其他对脚本不友好的字符。
-
你可以直接从主机运行
mysql,绕过所有这些设置吗? -
@micke 感谢您的想法,不幸的是,我尝试了您的解决方案,但没有帮助。
-
@DavidMaze 是的,那会更容易,但我不能这样做,因为我所有的密码都存放在 docker secret 中,所以只能在容器中访问。这就是为什么我需要创建一个容器,获取我想要的密码并删除容器。