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 update
和apt-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/