【问题标题】:Bash scripts exits on entering docker containerBash 脚本在进入 docker 容器时退出
【发布时间】:2018-01-18 22:27:39
【问题描述】:

我正在尝试创建一个 bash 脚本,用于在新服务器上设置 docker 和应用程序。

很新鲜来抨击自己,但我认为我得到了公正

这是我的问题所在的 sn-p -

#
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 向导!

任何帮助表示赞赏!

【问题讨论】:

  • 请澄清:您是否尝试在容器内运行apt-get update & apt-get install git & cd /var/www/html
  • 另外,请提供docker logs application 的输出,以便我们更好地了解问题:)
  • 是的,这是正确的 - 在 docker exec 命令上,bash 脚本停止/退出那里,因为没有运行我在这一步之后必须运行的其余命令
  • apt-get update & ....apt-get update && ... 有很大不同,单个& 在后台运行前面的cmd,然后尝试立即启动下一个命令。那没有意义。切换到&& 为该行的所有人。祝你好运。
  • 感谢我以前不知道的!但是在这里对我没有多大帮助:)

标签: linux bash performance docker containers


【解决方案1】:

这就是-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"

【讨论】:

    【解决方案2】:

    这里有几点说明:

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

    另外,docker exec -it application /bin/bash 命令会进入interactive 模式,它会为你分配一个命令行,所以脚本会在那里停止执行,等待你在stdin 输入一些命令。

    现在,如果您想在 docker 容器中运行一系列命令,则无法通过在脚本中提供它们来实现。

    您可以做的一件事是创建一个脚本文件(例如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,以便在构建容器时运行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/

    【讨论】:

    • 感谢您的帖子!您在其中提出了一些好处-我正在努力开发dockerfile,所以是的,这很有意义!我现在理解 -it 命令只是缺乏理解,所以有了这一切,我现在可以得到我想要达到的目标 - 干杯! :)
    • 欢迎来到美丽的 Docker 世界 @CalvinTaylor 我保证,这太棒了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2017-02-21
    • 2020-02-06
    相关资源
    最近更新 更多