Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在开发工作流期间使用docker_Node.js_Docker_Boot2docker - Fatal编程技术网

Node.js 在开发工作流期间使用docker

Node.js 在开发工作流期间使用docker,node.js,docker,boot2docker,Node.js,Docker,Boot2docker,我在OS X上使用boot2docker并克隆了以下repo: 它基本上有一个Dockerfile和一个打印hello world的非常简单的express应用程序。当我构建并运行映像时,一切都运行得很好,但当然,如果我在Mac上对index.js进行任何更改,这些都不会反映在我的运行映像中。我似乎找不到任何关于如何设置docker的参考资料,这样我就可以在我的开发环境中运行docker,自动获取我的源代码更改,所以我觉得我“做错了”。有什么建议吗 以下是我目前运行它的方式(我没有使用Vagr

我在OS X上使用boot2docker并克隆了以下repo:

它基本上有一个Dockerfile和一个打印hello world的非常简单的express应用程序。当我构建并运行映像时,一切都运行得很好,但当然,如果我在Mac上对index.js进行任何更改,这些都不会反映在我的运行映像中。我似乎找不到任何关于如何设置docker的参考资料,这样我就可以在我的开发环境中运行docker,自动获取我的源代码更改,所以我觉得我“做错了”。有什么建议吗

以下是我目前运行它的方式(我没有使用Vagrant,也不太确定这是否有什么不同):

更新:添加了一个关于我最终所做的事情的答案


更新:使用boot2docker 1.3+和图添加了更多最新答案。

docker可以在web开发中帮助以下几种场景:

  • lighting fast在本地提供各种服务。你想要一个干净的couchdb,运行
    docker run-d-p5984:5984 tutum/couchdb
    ;mysql,没问题:
    docker run-d-p3306:3306tutum/mysql
    ,一个使用firefox的selenium服务器?简单:
    sudo docker run-p 4444:4444-d lzhang/selenium
    ,你会立即得到它们,它们可以在你不想要的下一秒被
    docker kill
    摧毁。非常适合本地测试场景,无需担心如何配置它们

  • 管理软件依赖关系。例如,您想在不同的节点版本(0.8、0.10、0.10.25等)下运行节点应用程序,只需通过
    docker search nodejs
    查找nodejs docker图像,并通过将应用程序目录装载为卷来创建容器,就可以运行彼此隔离的多个容器。请看一下我的项目,了解如何在0配置的情况下在几秒钟内使用mongodb运行复杂的节点应用程序。考虑一个更复杂的模型:负载平衡器+应用程序+数据库+缓存,按照老派的方式,有大量的配置选项适合设置过程,但是,如果您将它们作为单独的容器提供,每个组件都可以通过本地环境变量相互发现,就像本地PaaS一样

  • 通过搜索使用应用程序的简单方法。例如,有一个整洁的工具叫做,您可以通过一个命令在一个容器中快速下载/使用它,并且可以随时进行配置,甚至不需要考虑配置、下载语言运行库、配置、卸载等


  • 根据boot2docker,我假设您在OSX上,因此您最好选择支持hostonly网络配置的v0.9.2+版本,然后您可以通过hostonly网络访问VM内部运行的容器。

    您的问题非常有趣,并且(部分)与Docker没有具体关系。 让我说,这里的主要和最后一个问题是虚拟机的使用

    当您使用VM(裸Virtualbox VM、Vagrant VM、Docker boot2docker VM…)时,跟踪主机上的代码更改可能是一项挑战

    VM是Mac(发生代码更改的地方)和应用程序堆栈(这里是运行在小型Linux VM上的Docker容器)之间的完整抽象层

    • 您必须在Mac和boot2docker之间的Virtualbox中明确定义共享文件夹(NFS…)。此共享文件夹将是代码存储库的根目录。这是第一步

      Mac:/Users/You/stuff/approt==>boot2docker:/something


    • 然后,您必须告诉Docker容器使用绑定到boot2docker的卷(Docker术语),并将Docker应用程序指向它:
    docker run-v/something:/app/path/inside/docker-p 49160:8080\ -d gasi/centos节点hello/usr/bin/node/app/path/inside/docker/index.js

    • 让NodeJ检测文件更改是另一个挑战。您需要一个额外的包装器来监视文件系统并在代码更改时重新启动节点(,…)

    • 之后,由于更改不会发生在本地文件系统上,而是发生在共享文件夹上,因此您可能必须通知Nodejs watcher(Forever/Nodemon/…)使用轮询模式。它可以工作(或多或少),但会消耗大量CPU


    这就是我最终要做的事情,到目前为止似乎很有效,但我仍在深入研究:

    # script located in bin/run
    NS=mycompany
    PROJECT=myproject
    
    # kill and remove old container if it exists
    docker kill $PROJECT
    docker rm $PROJECT
    
    # tag the previously built image
    docker tag $NS/$PROJECT $NS/$PROJECT:old
    
    # build the new image
    docker build -t $NS/$PROJECT .
    
    # remove the old image
    docker rmi $NS/$PROJECT:old
    
    docker run -dP --name=$PROJECT $NS/$PROJECT /sbin/my_init
    
    在我的项目根目录中,我只需运行:

    nodemon -x bin/run
    
    这是值得赞扬的

    docker 1.3和fig的更新

    太棒了,它真的让我以前的脚本变得非常复杂。此外,boot2docker现在本机支持使用Virtual Box的共享文件夹在Mac OS X上装载卷。这就是我发现现在对我很有效的方法:

    首先,
    Dockerfile

    FROM ubuntu:14.04
    
    # Replace shell with bash so we can source files
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    
    # Set debconf to run non-interactively
    RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    
    # Install base dependencies
    RUN apt-get update && apt-get install -y -q --no-install-recommends \
            build-essential \
            ca-certificates \
            curl \
            git \
            libssl-dev \
            python \
            rsync \
            software-properties-common \
            wget \
        && rm -rf /var/lib/apt/lists/*
    
    ENV NVM_DIR /usr/local/nvm
    ENV NODE_VERSION 0.10.33
    
    # Install nvm with node and npm
    RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \
        && source $NVM_DIR/nvm.sh \
        && nvm install $NODE_VERSION \
        && nvm alias default $NODE_VERSION \
        && nvm use default
    
    ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
    ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH
    
    CMD ["npm", "start"]
    
    图yml

    app:
        image: myNodeImage
        working_dir: /home/myProject
        volumes_from:
         - myvols
    
    下面是新的
    bin/run

    #!/usr/bin/env bash
    # This is the the bin/run script
    
    docker run --rm --volumes-from myvols myNodeImage \
        rsync \
            --delete \
            --recursive \
            --safe-links \
            --exclude .git  --exclude node_modules  \
        /data/myProject/ /home/myProject
    
    fig up
    
    我还有一个
    bin/install
    脚本,用于执行
    node\u模块的依赖项安装。这假设我已经在我的主机上安装了npm,这样任何私有包都可以工作。此外,这对npm链接也非常有效,您只需在容器中从
    /home/linkedProject
    创建一个符号链接到
    $NODE\u PATH/linkedProject

    #!/usr/bin/env bash
    # This is the the bin/install script
    
    docker run --rm --volumes-from myvols myNodeImage \
        rm -rf /home/myProject && \
        rsync \
            --delete \
            --recursive \
            --safe-links \
            --exclude .git \
            /data/myProject/ /home/myProject && \
        cd /home/myProject && \
        npm rebuild
    
    所以,要把这些放在一起,以下是按顺序排列的步骤:

  • 创建我的数据卷容器:

    docker run-v$HOME/data:/data:ro\
    -v/家\
    -v/path/to/NODE\u路径\
    --名称myvols myNodeImage echo创建我的卷

  • 运行我的安装脚本:
    cd~/data/myProject&&/bin/install

  • 运行我的运行脚本:
    nodemon-x bin/Run


  • 关于与VirtualBox共享的文件夹,请检查:

    boot2docker与VirtualBox来宾添加一起
    如何将/用户装载到boot2docker中

    tl;dr构建您自己的自定义boot2docker.i
    #!/usr/bin/env bash
    # This is the the bin/run script
    
    docker run --rm --volumes-from myvols myNodeImage \
        rsync \
            --delete \
            --recursive \
            --safe-links \
            --exclude .git  --exclude node_modules  \
        /data/myProject/ /home/myProject
    
    fig up
    
    #!/usr/bin/env bash
    # This is the the bin/install script
    
    docker run --rm --volumes-from myvols myNodeImage \
        rm -rf /home/myProject && \
        rsync \
            --delete \
            --recursive \
            --safe-links \
            --exclude .git \
            /data/myProject/ /home/myProject && \
        cd /home/myProject && \
        npm rebuild