使用RUN命令在docker中执行shell脚本
新来的docker工人,请耐心等待。
我的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会正常执行。
我无法弄清楚我在做什么错,请帮忙。
我猜(我可能是错的,因为我既不是MongoDB也不是Docker专家),你的mongod --fork
和/bin/sh -c
是罪魁祸首。
你基本上执行的是这样的:
/bin/sh -c mongod --fork ...
哪一个
- 执行一个shell
- 这个shell执行一个命令并等待它完成
- 此命令以守护进程模式启动MongoDB
- MongoDB分支并立即退出
最简单的解决方法可能只是使用
CMD ["mongod"]
就像官方的MongoDB Docker一样。
我build议你创build一个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行replace它来修改您的Dockerfile:
COPY entrypoint.sh / RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
然后使用重build你的容器图像
docker build -t NAME:TAG .
现在运行以下命令来validation入口点是否是/entrypoint.sh
docker inspect NAME:TAG | less