假设我有以下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中必须只有一个入口点。那么正确的方法是什么呢?
简单的答案是,你不应该这样做,因为它打破了单一责任原则:一个容器,一个服务。想象一下,由于工作负载突然增加,您希望生成更多的MongoDB云映像—为什么还要以1:1的比例增加Apache2实例?相反,您应该链接这些框,并使它们通过TCP讲话。看见https://docs.docker.com/userguide/dockerlinks/更多信息。
我的解决方案是将单个脚本放入/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"]
正如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包含应该在挂载的目录文件上运行的命令。