我想创建一个docker容器来加载MEAN堆栈(具体是Mongo-Node)。根据我的理解,我不能在我的Dockerfile中使用多个FROM
语句,在docker镜像上设置Node和Mongo的最简单方法是什么?
我这样做吗,
FROM node:0.10.40
RUN <whatever the mongo install command is>
或者,
FROM mongo:2.6.11
RUN <whatever the npm install command is>
或其他什么?
答案 0 :(得分:1)
看看支持这些来源的Dockerfiles!
如果他们都来自可比源(即ubuntu),那么你应该能够获取mongo dockerfile并将其修改为从节点映像转到,从而生成一个包含两种服务的图像。
因此,修改the mongo:2.6.11 dockerfile:
FROM node:0.10.40
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates curl \
numactl \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
RUN curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.6/gosu-$(dpkg --print-architecture)" \
&& curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.6/gosu-$(dpkg --print-architecture).asc" \
&& gpg --verify /usr/local/bin/gosu.asc \
&& rm /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys DFFA3DCF326E302C4787673A01C4E7FAAAB2461C
ENV MONGO_VERSION 2.6.11
RUN curl -SL "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz" -o mongo.tgz \
&& curl -SL "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz.sig" -o mongo.tgz.sig \
&& gpg --verify mongo.tgz.sig \
&& tar -xvf mongo.tgz -C /usr/local --strip-components=1 \
&& rm mongo.tgz*
VOLUME /data/db
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
...当然,如果您要这样做,您需要修改入口点以运行这两种服务。
然而:根本不做这个!最佳实践方法是拥有多个容器,每个服务一个容器,而不是仅构建一个运行所有服务的容器你的堆栈。以这种方式将组件保存在自己的沙盒命名空间中可以降低几个方面的复杂性:跨容器的安全漏洞的空间较小;容器之间的相互依赖性较小(新发布的节点所需的软件更新不会破坏mongodb或反向);您的容器不需要init系统或与监督多种服务相关的其他组件;等
请参阅Docker网站上的Container Linking documentation,了解如何配置容器以便进行通信。