Dockerize流星应用程序

时间:2019-01-23 13:46:21

标签: node.js docker meteor centos7

我有一个流星应用程序。此应用程序在Centos7 VM上运行良好。
我需要创建此应用的docker容器,然后在其他虚拟机上安装或导入该容器。
ِ docker文件需要什么来保存和加载另一个VM上的容器?
NodeJs
Mongodb
MeteorJs

我不应该将Mongodb文件存储在Docker容器中吗?

这是我的docker文件:

# Pull base image.
FROM node:8.11.4
# Install build tools to compile native npm modules
RUN npm install -g node-gyp
RUN apt-get install curl -y
RUN curl https://install.meteor.com/ | sh
# Create app directory
RUN mkdir -p /usr/app
COPY . /usr/app
RUN cd /usr/app/programs/server
RUN npm install
WORKDIR /usr/app
CMD ["node", "main.js"]
EXPOSE 3000

2 个答案:

答案 0 :(得分:2)

有很多方法可以使这只猫皮肤化……假设您已经研究了使用自动执行以下设置的工具使用容器执行流星应用程序的替代方法-流星称其为自动化Galaxy的版本

我建议您在旨在从中运行应用程序的容器外部运行meteor命令,因为流星安装的过程非常庞大,安装缓慢,并且您可能需要插入某些库,或者您的库需要插入的库可能需要c或c ++编译器,这样流星及其朋友就不需要在每次要重新编译应用时都安装到您的应用容器中……您的应用容器只需要nodejs和bundle……当您执行流星应用时,它不会使用流星而不是直接使用nodejs执行该应用程序,因为此时您的代码已编译为一个纯nodejs的包

是的,最好将mongodb放入其自己的容器中

否,无需像在流星上一样将MeteorJs放入应用容器中,那么在执行期间就不需要那些编译时工具,因此,安装MeteorJs以及成功所需的所有其他工具在您执行meteor build命令

的主机上构建流星

在上面的Dockerfile中,永远不会到达最后一条语句EXPOSE 3000,因此请将其放在您的CMD节点之前

因此,在您的容器外部安装流星,然后发出

cd /your/webapp/src
meteor build --server https://example.com  --verbose  --directory /webapp --server-only 

以上将把您的流星项目编译为一个居住在的捆绑包目录

ls -la /webapp/bundle/

然后将您的Dockerfile等复制到新剪切的包目录中:

.bashrc
Dockerfile
bundle/

然后创建您的容器

docker build --tag localhost:5000/hygge/loudweb-admin --no-cache . 
docker push localhost:5000/hygge/loudweb-admin

这是精简的Dockerfile

cat Dockerfile

#  normal mode - raw ubuntu run has finished and base image exists so run in epoc mode

FROM ubuntu:18.04

ENV DEBIAN_FRONTEND noninteractive
ENV TERM linux

ENV NODE_VER=v8.11.4
ENV NODE_NAME=node-${NODE_VER}
ENV OS_ARCH=linux-x64
ENV COMSUFFIX=tar.gz

ENV NODE_PARENT=/${NODE_NAME}-${OS_ARCH}
ENV PATH=${NODE_PARENT}/bin:${PATH}
ENV NODE_PATH=${NODE_PARENT}/lib/node_modules

RUN apt-get update && apt-get install -y wget   && \
    wget -q https://nodejs.org/download/release/${NODE_VER}/${NODE_NAME}-${OS_ARCH}.${COMSUFFIX} && \
    tar -xf ${NODE_NAME}-${OS_ARCH}.${COMSUFFIX}

ENV MONGO_URL='mongodb://$MONGO_SERVICE_HOST:$MONGO_SERVICE_PORT/meteor'
ENV ROOT_URL=https://example.com

ENV PORT 3000
EXPOSE 3000

RUN which node

WORKDIR /tmp

# CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf" ]
#  I strongly suggest you wrap below using supervisord
CMD ["node", "main.js"]

启动您的容器问题

docker-compose -f /devopsmicro/docker-compose.yml pull loudmail  loud-devops  nodejs-enduser
docker-compose -f /devopsmicro/docker-compose.yml up -d 

这是精简的docker compose yaml文件

version: '3'
services:

  nodejs-enduser:
    image: ${GKE_APP_IMAGE_ENDUSER}
    container_name: loud_enduser
    restart: always
    depends_on:
      - nodejs-admin
      - loudmongo
      - loudmail
    volumes:
      - /cryptdata6/var/log/loudlog-enduser:/loudlog-enduser
      - ${TMPDIR_GRAND_PARENT}/curr/loud-build/${PROJECT_ID}/webapp/enduser/bundle:/tmp
    environment:
      - MONGO_SERVICE_HOST=loudmongo
      - MONGO_SERVICE_PORT=$GKE_MONGO_PORT
      - MONGO_URL=mongodb://loudmongo:$GKE_MONGO_PORT/test
      - METEOR_SETTINGS=${METEOR_SETTINGS}
      - MAIL_URL=smtp://support@${GKE_DOMAIN_NAME}:blah@loudmail:587/
    links:
      - loudmongo
      - loudmail
    ports:
     - 127.0.0.1:3000:3000
    working_dir: /tmp
    command: /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

一旦您的应用使用容器执行,就可以停止使用ubuntu作为容器基础,并使用更小,更简单的docker base映像(例如nodejs,busybox等),但是使用ubuntu最初比较容易,因为它可以让您从正在运行的容器中安装软件包,这在开发过程中很不错

上面周围的阴谋是巨大的...上面是从房子的devops一侧拔出的快速复制N粘贴,其中包含数百个帮助程序二进制文件,脚本,配置模板,tls证书...应用程序执行的世界

答案 1 :(得分:1)

@Scott Stensland的答案很好,因为它说明了如何为Meteor手动创建docker容器。

有一种更简单的方式使用流星(mup)http://meteor-up.com/

  

轻松部署您的应用

     

Meteor Up是一款具有生产质量的Meteor应用程序部署工具。

     

使用一个命令安装:

string_to_be_checked = input("enter your string ") if string_to_be_checked == string_to_be_checked[::-1] : print("palindrome") else: print("not palindrome")

您设置了一个简单的配置文件,它会在创建容器,执行npm安装,设置ssl证书等之后查看。比手工完成的工作要少得多