2017-08-10 35 views
0

我试图创建一个bash脚本,用于在新服务器上设置docker和应用程序。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 -it application bash 

apt-get update & apt-get install git & cd /var/www/html 

- docker exec -it application bash

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

无论如何我可以解决这个问题吗?我不认为有,但如果有任何bash巫师在那里!

任何帮助表示赞赏!

+0

请澄清:你想运行'apt-get的更新和易于得到安装的git和CD的/ var/WWW /在容器内的HTML? – Fotis

+0

此外,请提供'docker logs应用程序'的输出,以便我们可以更好地了解问题:) – Fotis

+0

是的fotis thats correct - 在docker exec命令bash脚本停止/退出,因为没有运行其余的在这步 –

回答

0

这就是-it应该做的。它意味着一个交互式的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" 
1

一个几句话在这里:

这是更好地使用docker exec -it application /bin/bash(提供的路径,bash可执行文件),因为在容器通常在$ PATH没有设置,让你”重新可能会得到一个错误。

此外,命令docker exec -it application /bin/bash将进入interactive模式,它为您分配命令行,因此脚本将停止执行,并等待您输入一些命令stdin

现在,如果您想在泊坞窗容器中运行一系列命令,则无法通过在脚本中提供它们来执行此操作。

一两件事你可以做的,就是创建一个你可以安装一个卷到你docker run(如:docker run -v /Users/Calvin/myscript.sh:/myscript.sh,你可以做的另一件事是通过-c提供的命令,所以docker exec application /bin/sh -C 'apt-get update ....'脚本文件(如:myscript.sh)(我不使用-it标志)的通知。

最后,最好的做法是什么你想实现的是提供一个Dockerfile,让你运行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/

+0

感谢您的帖子!你有一些好点 - 我正在努力找到一个码头文件,所以是有道理的!我明白了-it命令现在只是缺乏理解,所有这些我可以得到我想要的现在 - 干杯! :) –

+0

欢迎来到美丽的Docker @CalvinTaylor世界我保证,这真是太棒了:) – Fotis