【问题标题】:Create docker container, execute a script and delete the container创建 docker 容器,执行脚本并删除容器
【发布时间】: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 中,所以只能在容器中访问。这就是为什么我需要创建一个容器,获取我想要的密码并删除容器。

标签: mysql bash docker swarm


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多