Node.js 在开发工作流期间使用docker
我在OS X上使用boot2docker并克隆了以下repo: 它基本上有一个Dockerfile和一个打印hello world的非常简单的express应用程序。当我构建并运行映像时,一切都运行得很好,但当然,如果我在Mac上对index.js进行任何更改,这些都不会反映在我的运行映像中。我似乎找不到任何关于如何设置docker的参考资料,这样我就可以在我的开发环境中运行docker,自动获取我的源代码更改,所以我觉得我“做错了”。有什么建议吗 以下是我目前运行它的方式(我没有使用Vagrant,也不太确定这是否有什么不同): 更新:添加了一个关于我最终所做的事情的答案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
更新:使用boot2docker 1.3+和图添加了更多最新答案。docker可以在web开发中帮助以下几种场景:
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
摧毁。非常适合本地测试场景,无需担心如何配置它们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应用程序指向它:
- 让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