当前位置: 首页 > 知识库问答 >
问题:

Docker多入口点

班泽语
2023-03-14

假设我有以下Dockerfile:

FROM ubuntu

RUN apt-get update
RUN apt-get install -y apache2
RUN apt-get install -y mongod #pretend this exists

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2"]

ENTRYPOINT命令使得apache2在容器启动时启动。我还希望能够在容器启动时使用命令service mongod start启动mongod。但是,根据文档,Dockerfile中必须只有一个入口点。那么正确的方法是什么呢?


共有3个答案

黄弘新
2023-03-14

简单的答案是,你不应该这样做,因为它打破了单一责任原则:一个容器,一个服务。想象一下,由于工作负载突然增加,您希望生成更多的MongoDB云映像—为什么还要以1:1的比例增加Apache2实例?相反,您应该链接这些框,并使它们通过TCP讲话。看见https://docs.docker.com/userguide/dockerlinks/更多信息。

汪德寿
2023-03-14

我的解决方案是将单个脚本放入/opt/run/,并使用以下命令执行它们:

#!/bin/bash

LOG=/var/log/all

touch $LOG

for a in /opt/run/*
do
    $a >> $LOG &
done

tail -f $LOG

我的切入点就是这个脚本的位置,比如它叫做/opt/bin/run_all

ADD 00_sshd /opt/run/
ADD 01_nginx /opt/run/

ADD run_all /opt/bin/
ENTRYPOINT ["/opt/bin/run_all"]
杨景山
2023-03-14

正如Jared Markell所说,如果您希望在docker容器中启动多个进程,则必须使用supervisor。您必须配置主管,让他启动您的不同流程。

我在这篇博客文章中写了这一点,但是你有一篇非常好的文章详细描述了如何以及为什么在Docker中使用主管。

基本上,你会想做这样的事情:

FROM ubuntu

RUN apt-get update
RUN apt-get install -y apache2
RUN apt-get install -y mongod #pretend this exists
RUN apt-get install -y supervisor # Installing supervisord

ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 

EXPOSE 80

ENTRYPOINT ["/usr/bin/supervisord"]

并将配置添加到文件管理器命令中。形态

[supervisord]
nodaemon=true

[program:mongodb]
command=/etc/mongod/mongo #To adapt, I don't know how to launch your mongodb process

[program:apache2]
command=/usr/sbin/apache2 -DFOREGROUND

编辑:由于这个答案已经获得了相当多的赞成票,我想准确地警告一下,使用主管不被认为是运行多个作业的最佳实践。相反,您可能有兴趣为您的不同流程创建几个容器,并通过docker comment管理它们。简单地说,Docker Comment允许您在一个文件中定义应用所需的所有容器,并在一个命令中启动它们。

 类似资料:
  • 我正在从另一个设置了特定入口点的图像创建一个图像。但是,我希望我的图像有一个默认的。如何重置入口点? 我尝试了以下Dockerfile: 不幸的是,它不像默认的入口点那样工作,因为它需要引用命令。 如何在不引用的情况下使用命令?

  • 我有以下DockerFile: 这是什么意思:switch的值丢失了,我如何运行它?谢谢你的帮助 更新 请参阅此处:docker ASP.NET核心容器在mysql容器之后启动以获取更多信息。很抱歉有类似的第二个线程。请删除此线程

  • Maybe you are building an application that has multiple urls. An example of this would be a solution where you have two, or more, different URLs responding with different pages. Maybe you have one use

  • 我试图让我的docker db容器在创建时自动用数据集填充数据库。根据mariadb留档,卷中有一个文件夹可用于此目的。 我设置了我的文件来镜像我在StackOverflow上找到的示例,但是仍然无法执行我的SQL脚本。以下是我的文件的相关部分: 在文件,我有一个文件: 在每次测试迭代之前,我会清理所有旧的/缓存的Docker内容: 我发现这实际上并没有删除数据库卷。运行仍会显示过去存在的卷 Do

  • 是否有一种方法可以在Dockerfile入口点中将命令作为参数执行?我正在创建一个映像,该映像应该自动运行处理器的数量,即或。 有人设法得到这种工作流程吗?

  • 我的Dockerfile有一个在EntryPoint上运行的脚本。容器计划用我的代码所在的卷挂载运行,一旦容器用卷挂载运行,它需要运行几个命令。 docker run-itd-v/home/user/directory:/my-mount-dir build-container 注意:startup-script.sh包含应该在挂载的目录文件上运行的命令。