【问题标题】:Docker Container starting with mongo serverDocker Container 从 mongo server 开始
【发布时间】:2017-11-17 22:38:21
【问题描述】:

所以,我已经准备好构建一个 docker 容器,但是,当我构建它时,我需要手动从 docker 容器中启动 mongod。我究竟做错了什么?我从 Dockerfile 启动了 mongod,但看起来有些东西正在杀死进程,或者该进程甚至从未被执行?

FROM microsoft/iis:10.0.14393.206  
SHELL ["powershell"]

RUN Install-WindowsFeature NET-Framework-45-ASPNET ; \  
    Install-WindowsFeature Web-Asp-Net45

COPY  Pub Pub

RUN mkdir data\db

COPY mongodb_installer.msi mongodb_installer.msi

RUN Start-Process -FilePath 'mongodb_installer.msi' -ArgumentList '/quiet', '/NoRestart' -Wait ; \
    Remove-Item .\mongodb_installer.msi 

RUN 'C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe'

RUN Remove-WebSite -Name 'Default Web Site'  
RUN New-Website -Name 'Pub' -Port 80 \  
    -PhysicalPath 'C:\Pub' -ApplicationPool '.NET v4.5'


EXPOSE 80

CMD ["ping", "-t", "localhost"]  

当我从 withing 容器启动 mongod 时,我的 web api 应用程序运行良好,需要知道如何设置 mongod 从启动运行?

【问题讨论】:

  • 看起来您正试图在单个容器中运行多个进程。这不是 docker 的设计方式。如果您在单独的容器中运行每个进程(Web 服务、mongodb 等),它会更好地工作。

标签: mongodb docker dockerfile docker-container docker-image


【解决方案1】:

我自己也试过这个。我发现您实际上无法从 Dockerfile 启动进程。通过为某个程序提供所有安装命令来制作 Docker 镜像似乎很自然,但在构建镜像时它还不是一个正在运行的实例。

如果我没记错的话,解决方案是在 Dockerfile 中使用 ENTRYPOINT 语句,以便它在运行时而不是构建时执行这些命令。

This 可能会成为一个有趣的后续阅读。

这里是documentation Docker 用于ENTRYPOINT 语句。

【讨论】:

  • 我仍然没有做正确的事情......我添加了这样的入口点:ENTRYPOINT ["C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe"] 然后使用像这样运行: docker run --name pub -d -p 80:80 pub 我错过了什么?
  • 我希望我知道该说什么,但以前做过一次并不一定意味着我明白我在做什么。我会推迟出现的任何其他答案,我深表歉意。要考虑的事情可能包括 Dockerfile 中依赖于 mongod 运行但在进程启动之前执行的命令,以及您尝试在 Dockerfile 中启动的任何其他进程。 mongodb_installer.msi 可能是一个。
  • 您为我指明了正确的方向,谢谢您,如果我找到方法会发布,再次感谢您!
  • 好的,一切就绪,但是,现在的问题是我的批处理文件在启动时没有执行。 CMD C:\init.bat && cmd 你碰巧知道这件事吗?
  • 从我上面链接的问题中:“ENTRYPOINT 指定了一个在容器启动时将始终执行的命令。CMD 指定将提供给ENTRYPOINT 的参数。”尝试将您的init.bat 添加到您的ENTRYPOINT 的可执行脚本中。我认为这是您的 Dockerfile 中 ENTRYPOINTCMD 语句的冲突。
【解决方案2】:

所以,根据@Peri461 提供的答案,朝着正确的方向前进,这使它最终发挥了作用:

FROM microsoft/iis:10.0.14393.206  
SHELL ["powershell"]

RUN Install-WindowsFeature NET-Framework-45-ASPNET ; \  
    Install-WindowsFeature Web-Asp-Net45

COPY Pub Pub

RUN mkdir data\db

COPY mongodb_installer.msi mongodb_installer.msi

RUN Start-Process -FilePath 'mongodb_installer.msi' -ArgumentList '/quiet', '/NoRestart' -Wait ; \
    Remove-Item .\mongodb_installer.msi     

RUN Remove-WebSite -Name 'Default Web Site'  
RUN New-Website -Name 'Pub' -Port 80 \  
    -PhysicalPath 'C:\Pub' -ApplicationPool '.NET v4.5'

ADD init.bat init.bat

ENTRYPOINT C:\init.bat

EXPOSE 80

CMD ["ping", "-t", "localhost"]  

入口点应该指向容器启动时应该执行的批处理。之后,只需像这样启动容器:

docker run --name pub -d -p 80:80 pub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 2021-11-28
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多