微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建docker容器,执行脚本并删除容器

如何解决创建docker容器,执行脚本并删除容器

我想要一个命令,首先会创建一个 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 集群工作

解决方法

我终于找到了解决方案,我用另一个图像重写了我的 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 没有正确调用我的脚本。

我希望这会帮助另一个人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。