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

时间:2016-03-08 19:53:50

标签: bash shell docker dockerfile

码头工人的新手,所以请耐心等待。

我的Dockerfile包含一个ENTRYPOINT:

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

容器的泊坞窗日志是

"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执行正常。

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

2 个答案:

答案 0 :(得分:0)

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

您实际执行的是:

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

其中

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

最简单的修复可能就是使用

 CMD ["mongod"]

就像official MongoDB Docker那样。

答案 1 :(得分:0)

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