创建 docker 个容器,执行脚本并删除容器
Create docker container, execute a script and delete the container
我想要一个命令,首先创建一个 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
然后每个服务都有自己的数据库-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 集群上工作
我终于找到了解决方案,我用另一个图像重写了我的 Dockerfile :
FROM alpine:3.7 # <----- Changed
WORKDIR /database-file
RUN mkdir database-file
COPY * /database-file/
RUN apt-get update && apt-get -y install mysql-client # <----- Deleted
RUN apk add mysql-client # <----- Added
RUN apk add git # <----- Added
RUN apk add openssh-client # <----- Added
RUN chmod +x ./database-prepare.sh
VOLUME /app/log
ENTRYPOINT ["sh","./database-prepare.sh"] # <----- Changed
我认为真正的问题是我的 ENTRYPOINT,经过反思我认为我的旧 ENTRYPOINT 没有正确调用我的脚本。
我希望这对另一个人有帮助。
我想要一个命令,首先创建一个 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
然后每个服务都有自己的数据库-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 集群上工作
我终于找到了解决方案,我用另一个图像重写了我的 Dockerfile :
FROM alpine:3.7 # <----- Changed
WORKDIR /database-file
RUN mkdir database-file
COPY * /database-file/
RUN apt-get update && apt-get -y install mysql-client # <----- Deleted
RUN apk add mysql-client # <----- Added
RUN apk add git # <----- Added
RUN apk add openssh-client # <----- Added
RUN chmod +x ./database-prepare.sh
VOLUME /app/log
ENTRYPOINT ["sh","./database-prepare.sh"] # <----- Changed
我认为真正的问题是我的 ENTRYPOINT,经过反思我认为我的旧 ENTRYPOINT 没有正确调用我的脚本。
我希望这对另一个人有帮助。