使用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