Bash 使用RUN命令在docker中执行shell脚本

Bash 使用RUN命令在docker中执行shell脚本,bash,shell,docker,dockerfile,Bash,Shell,Docker,Dockerfile,码头工人是新手,所以请容忍我 我的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

码头工人是新手,所以请容忍我

我的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
现在,以下所有运行命令都无法执行此脚本

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执行良好

我不知道我做错了什么,请帮帮我。

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

您实际上执行的是:

/bin/sh-c mongod--fork…

哪个

  • 执行shell
  • 这个shell执行一个命令并等待它完成
  • 此命令以守护程序模式启动MongoDB
  • MongoDB分叉并立即退出
最简单的修复方法可能就是使用

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

您实际上执行的是:

/bin/sh-c mongod--fork…

哪个

  • 执行shell
  • 这个shell执行一个命令并等待它完成
  • 此命令以守护程序模式启动MongoDB
  • MongoDB分叉并立即退出
最简单的修复方法可能就是使用

 CMD ["mongod"]

像那样。

我建议您创建一个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


我建议您创建一个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日志的输出是什么?您是否尝试过使用just bash而不是startApp.sh启动容器,然后从bash提示符执行startApp.sh?sudo docker ps不会将其显示为正在运行的容器。因此无法获取日志。当尝试启动bash并执行startApp.sh时,它运行良好,并提供了预期的输出。好的,在没有任何进一步响应的情况下退出的容器具有以下日志-“即将分叉子进程,等待服务器准备好连接。分叉进程:7个子进程成功启动,父进程退出”请不要在评论中发布其他信息;将此信息添加到问题中,方法是将其取消。感谢您指出这一点,Frank,我已更新了问题。docker日志的输出是什么?您是否尝试过使用just bash而不是startApp.sh启动容器,然后从bash提示符执行startApp.sh?sudo docker ps不会将其显示为正在运行的容器。因此无法获取日志。当尝试启动bash并执行startApp.sh时,它运行良好,并提供了预期的输出。好的,在没有任何进一步响应的情况下退出的容器具有以下日志-“即将分叉子进程,等待服务器准备好连接。分叉进程:7个子进程成功启动,父进程退出”请不要在评论中发布其他信息;将此信息添加到问题中,方法是将其替换。感谢您指出Frank,我已更新了此问题。Frank,我需要--fork,因为在构建docker时。我需要将某些初始数据填充到MongoDB中。它必须在一个单独的shell中运行。我也尝试了你的方法,没有使用fork。它甚至没有完成mongod的执行,因此永远不会到达脚本。Frank,我需要--fork,因为在构建docker时。我需要将某些初始数据填充到MongoDB中。它必须在一个单独的shell中运行。我也尝试了你的方法,没有使用fork。它甚至没有完成mongod的执行,因此永远不会到达脚本。