【问题标题】:Executing a shell script within docker with RUN command使用 RUN 命令在 docker 中执行 shell 脚本
【发布时间】:2016-03-08 19:53:50
【问题描述】:

码头工人新手,请多多包涵。

我的 Dockerfile 包含一个入口点:

ENV MONGOD_START "mongod --fork --logpath /var/log/mongodb.log --logappend --smallfiles"
ENTRYPOINT ["/bin/sh", "-c", "$MONGOD_START"]

我有一个shell脚本通过python脚本向数据库添加一个条目,并启动服务器。

脚本startApp.sh

chmod +x /addAddress.py
python /addAddress.py $1
cd /myapp/webapp 
grunt serve --force

现在,下面所有的 RUN 命令都不能成功执行这个脚本。

sudo docker run -it --privileged myApp -C /bin/bash && /myApp/webapp/startApp.sh loc

sudo docker run -it --privileged myApp /myApp/webapp/startApp.sh loc

容器的docker日志是

"about to fork child process, waiting until server is ready for connections. forked process: 7 child process started successfully, parent exiting "

此外,当我在 docker 中打开 bash 提示符并运行它时,startApp.sh 执行良好。

我无法弄清楚我做错了什么,请帮助。

【问题讨论】:

  • docker logs <container> 的输出是什么?您是否尝试过仅使用 bash 而不是 startApp.sh 启动容器,然后从 bash 提示符执行 startApp.sh?
  • sudo docker ps 不会将其显示为正在运行的容器。所以无法获取日志。当尝试启动 bash 并执行 startApp.sh 时,它运行良好并给了我预期的输出。
  • 好的,没有任何进一步响应就退出的容器有以下日志-“即将分叉子进程,等待服务器准备好连接。分叉进程:7个子进程成功启动,父进程退出”
  • 请不要在 cmets 中发布附加信息;通过edit 将此信息添加到问题中。
  • 感谢您指出弗兰克,我已经更新了问题。

标签: bash shell docker dockerfile


【解决方案1】:

我建议你创建一个 entrypoint.sh 文件:

#!/bin/sh

# Initialize start DB command
# Pick from env variable MONGOD_START if it exists
# else use the default value provided in quotes
START_DB=${MONGOD_START:-"mongod --fork --logpath /var/log/mongodb.log --logappend --smallfiles"}

# This will start your DB in background
${START_DB} &

# Go to startApp directory and execute commands
`chmod +x /addAddress.py;python /addAddress.py $1; \
               cd /myapp/webapp ;grunt serve --force`

然后通过删除最后一行并将其替换为以下 3 行来修改您的 Dockerfile:

COPY entrypoint.sh /

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

然后使用

重建您的容器映像
docker build -t NAME:TAG .

现在您运行以下命令来验证 ENTRYPOINT 是否为 /entrypoint.sh

docker inspect NAME:TAG | less

【讨论】:

    【解决方案2】:

    我猜(我可能错了,因为我既不是 MongoDB 也不是 Docker 专家)你的 mongod --fork/bin/sh -c 的组合是罪魁祸首。

    你实际上在执行的是:

    /bin/sh -c mongod --fork ...

    哪个

    • 执行一个shell
    • 此 shell 执行单个命令并等待它完成
    • 此命令以守护程序模式启动 MongoDB
    • MongoDB 分叉并立即退出

    最简单的解决方法可能就是使用

     CMD ["mongod"]
    

    就像official MongoDB Docker 一样。

    【讨论】:

    • 弗兰克,我需要 --fork 因为在构建 docker 时。我需要将某些初始数据填充到 MongoDB 中。它必须在单独的 shell 中运行。
    • 我也试过你的方法,没有使用 fork。它甚至没有完成 mongod 的执行,因此永远不会到达脚本。
    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 2017-01-13
    • 2013-09-22
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多