Bash 使用RUN命令在docker中执行shell脚本
码头工人是新手,所以请容忍我 我的Dockerfile包含一个入口点: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
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的执行,因此永远不会到达脚本。