如何在'docker run'期间运行2个服务?

时间:2017-12-11 18:35:59

标签: docker service

我有一个Dockerfile,用Apache / php和redis创建一个图像。 我知道它应该分成2个容器。但是我想知道在运行过程中是否可以启动apache和redis。

现在我可以用两种不同的方式运行:

  1. docker run --rm -p 80:80 -p 6379:6379 -v $ MY_FULLPATH:/ var / www / html -e REMOTE_HOST = $ REMOTE_HOST my_img redis-server
  2. docker run --rm -p 80:80 -p 6379:6379 -v $ MV_FULLPATH:/ var / www / html -e REMOTE_HOST = $ REMOTE_HOST my_img apache2-foreground
  3. 如果我使用第一种方法运行,我必须打开终端手动启动apache。 如果我使用第二个运行,我必须手动启动REDIS。

    通过文档:"If you list more than one CMD then only the last CMD will take effect."我知道只有“redis-server”才会起作用。

    那么有没有办法自动设置展位? 。

    这是我的Dockerfile:

    #!/usr/bin/env bash
    exec apache2-foreground &
    exec redis-server &
    

    这是run.sh

    #!/bin/bash
    set -e
    
    # Check if our environment variable has been passed.
    if [ -z "${REMOTE_HOST}" ]
    then
      echo "REMOTE_HOST has not been set."
      exit 1
    else
      sed -i.bak "s/\$REMOTE_HOST/${REMOTE_HOST}/g" /usr/local/etc/php/php.ini
    fi
    
    exec "$@"
    

    这是entrypoint.sh

    {{1}}

1 个答案:

答案 0 :(得分:2)

您可以通过以下几种方式启动多个流程:

  • 将其作为服务启动
  • 通过cron作业(@reboot)
  • 启动它们
  • 在backgound中启动流程

Dockerfile发布后更新

在我尝试回答几个问题之前:

  • 每次在Dockerfile中输入RUN命令时,它都会创建一个新图层,它会使图像变大,构建变慢。
  • 这个容器显然试图做太多。一个容器应该做1件事,1件好事。

话虽如此,我想我有一个解决方案: - )

  • 删除run.sh
  • 将您的入口点更改为:

#!/bin/bash set -e # Check if our environment variable has been passed. if [ -z "${REMOTE_HOST}" ] then echo "REMOTE_HOST has not been set." exit 1 else sed -i.bak "s/\$REMOTE_HOST/${REMOTE_HOST}/g" /usr/local/etc/php/php.ini fi echo "Starting redis" exec redis-server & exec "$@"

  • 和Dockerfile的结尾:

RUN figlet EXPOSE_PORTS EXPOSE 80 #EXPOSE 6379 EXPOSE 9000 CMD ["apache2-foreground"]

重建并享受乐趣: - )

Screenshot of my running console