【问题标题】:How to start below services in docker Entrypoint如何在 docker Entrypoint 中启动以下服务
【发布时间】:2018-11-06 21:38:54
【问题描述】:

我想在容器运行时启动以下服务。

sudo service celeryd start
sudo service celerybeat start 
service php7.0-fpm start 
service rsyslog start 

当前以下命令无法运行 AWS ECS。并抛出一些错误。

ENTRYPOINT sudo service celeryd start 
&& sudo service celerybeat start 
&& service php7.0-fpm start 
&& service rsyslog start && bash

请告诉我怎么做

提前致谢。

【问题讨论】:

  • 请添加堆栈跟踪。还有这个&& bash 应该做什么?
  • sudo 没用,好像你的 Dockerfile 没有 USER xxx 指令,你是 root,正如 Ignacio You should provide a command that doesn't end 所说,所以你至少可以在末尾添加 && sleep infinity

标签: docker docker-compose dockerfile aws-ecs


【解决方案1】:

我不推荐整体设计,因为您在单个容器中运行多个应用程序。如果任何一项服务无法启动,您将没有错误处理或反馈。也就是说,可以通过使用在没有输入时不会退出的命令来解决您当前的问题。

ENTRYPOINT service celeryd start \
 && service celerybeat start \
 && service php7.0-fpm start \
 && service rsyslog start \
 && tail -f /dev/null

【讨论】:

  • 我是否还需要将上述入口点添加到任务定义中,还是仅在 dockerfile 中就足够了?
  • @user3849082 您只需将 dockerfile 中的行替换为这些行,然后重建您的图像。我不确定添加到“任务定义”是什么意思。
【解决方案2】:

您尝试作为入口点执行的命令是 bash 表达式,因此它们必须在 bash 终端内执行:

ENTRYPOINT ["/bin/bash", "-c", "sudo service celeryd start && sudo service celerybeat start && sudo service php7.0-fpm start && sudo service rsyslog start && tail -f /dev/null"]

此外,您的最后一个命令是 bash,因此容器将在执行入口点后立即结束。你应该提供一个不会结束的命令

【讨论】:

  • 是的,怎么做?
  • && 在您使用字符串语法时处理命令的默认 shell 中工作。无需使用 json 语法,然后手动添加一个 shell。缺乏对 bash 的输入是问题所在。
  • 刚刚根据 BMitch 的回答中的想法进行了编辑:使用 tail -f /dev/null 让它永远运行
  • 你完全正确的入口点,不需要 /bin/bash -c 和 JSON 格式
【解决方案3】:

将所有命令 start.sh 文件并赋予执行权限,在构建 docker 镜像时将该文件复制到 docker 镜像

在 CMD ["./start.sh"] 下写入 docker 文件

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2016-12-16
    • 1970-01-01
    • 2021-08-20
    • 2021-07-16
    • 2015-11-20
    • 2017-07-01
    • 2017-11-24
    • 2018-05-26
    相关资源
    最近更新 更多