Bash脚本在进入docker容器时退出

我试图创build一个bash脚本设置docker和一个新的服务器上的应用程序。

相当新鲜,但我认为我得到了公正

inheritance人是我的问题所在 –

docker run -d --name application -p 80:80 -d tutum/apache-php docker run -d -p 3306:3306 --name=database -- env="MYSQL_ROOT_PASSWORD=password1" mysql:latest echo "--------------------------------------------------------------------" echo "Docker is all done - run docker ps -a to see all created containers!" echo "--------------------------------------------------------------------" echo "Moving onto installing application into app container!" echo "--------------------------------------------------------------------" docker exec -it application bash apt-get update & apt-get install git & cd /var/www/html 

在线 – docker exec -it application bash

它按预期的方式进入容器,但是bash脚本然后停止,因为这个意思后面的命令不运行

无论如何,我可以解决这个问题吗? 我不认为有,但万一有什么bash奇才在那里!

任何帮助感激!

这就是应该做的。 这意味着一个交互式的bash,它只会在你完成之后退出。 改变你的代码如下

 docker run -d --name application -p 80:80 -d tutum/apache-php docker run -d -p 3306:3306 --name=database -- env="MYSQL_ROOT_PASSWORD=password1" mysql:latest echo "--------------------------------------------------------------------" echo "Docker is all done - run docker ps -a to see all created containers!" echo "--------------------------------------------------------------------" echo "Moving onto installing application into app container!" echo "--------------------------------------------------------------------" docker exec application bash -c "apt-get update & apt-get install git -y" docker exec -it application bash -c "cd /var/www/html; exec bash" 

这里有几点意见:

最好使用docker exec -it application /bin/bash (提供bash可执行文件的path),因为在容器中通常没有设置$ PATH,所以你可能会遇到一个错误。

另外,命令docker exec -it application /bin/bash会进入interactive模式,为你分配一个命令行,这样脚本就会停止执行,等待你inputstdin命令。

现在,如果要在Docker容器中运行一系列命令,则无法在脚本中提供这些命令。

你可以做的一件事就是创build一个脚本文件(例如myscript.sh ),你可以把它作为一个卷装入你的docker run -v /Users/Calvin/myscript.sh:/myscript.sh docker run (例如docker run -v /Users/Calvin/myscript.sh:/myscript.sh 。你可以做的另一件事是通过-c提供命令,所以docker exec application /bin/sh -C 'apt-get update ....' (注意我没有使用-it标志)。

最后,你要实现的最佳实践是提供一个Dockerfile ,以便在容器构build时运行apt-get updateapt-get install -y git ,而不是每次调出容器。

示例Dockerfile:

 FROM tutum/apache-php RUN apt-get update RUN apt-get install -y git 

然后使用docker build -t .

更多关于Dockerfile在这里: https ://docs.docker.com/engine/reference/builder/