我在OS X上使用boot2docker并克隆了以下repo:
https://github.com/enokd/docker-node-hello
它基本上有一个Dockerfile和一个打印hello world的非常简单的快速应用程序。当我构建并运行图像时,一切都运行良好,但当然如果我对我的Mac上的index.js进行任何更改,那么这一切都不会反映在我的运行图像中。我似乎无法找到关于我如何设置docker的任何参考,以便我可以在我的开发环境中运行它以自动获取我的源代码更改,所以我觉得我“做错了”。有什么建议吗?
以下是我目前正在运行的方式(我没有使用Vagrant,也不确定这是否有所不同):
$ docker build -t gasi/centos-node-hello .
$ docker run -p 49160:8080 -d gasi/centos-node-hello
$ curl localhost:49160
更新:添加了我最终做的答案。
更新:使用boot2docker 1.3+和图。
添加了更多当前答案答案 0 :(得分:7)
您的问题非常有趣,而且(部分)与Docker无关。 我要说这里的主要和最后一个问题是使用虚拟机。
使用虚拟机(裸虚拟机虚拟机,流媒体虚拟机,Docker boot2docker虚拟机......)时,跟踪主机上的代码更改可能是一个挑战。
VM是Mac(代码更改发生的地方)与应用程序堆栈(此处是在小型Linux VM上运行的Docker容器)之间的完整抽象层。
您必须在Mac和boot2docker之间的Virtualbox中明确定义共享文件夹(NFS,...)。此共享文件夹将是您的代码存储库的根目录。这是第一步。
Mac :/ Users / You / stuff / approot ===> boot2docker : / something
docker run -v /something:/app/path/inside/docker -p 49160:8080 \ -d gasi/centos-node-hello /usr/bin/node /app/path/inside/docker/index.js
答案 1 :(得分:5)
关于VirtualBox的共享文件夹,请查看:
boot2docker和VirtualBox Guest Additions
如何将/ Users挂载到boot2docker
tl; dr使用VirtualBox Guest构建您自己的自定义boot2docker.iso 添加(参见link)或下载 http://static.dockerfiles.io/boot2docker-v1.1.0-virtualbox-guest-additions-v4.3.12.iso 并将其保存到〜/ .boot2docker / boot2docker.iso。
编辑:更新了boot2docker v1.1.0的链接
答案 2 :(得分:4)
这就是我最终做的事情,到目前为止似乎有效,但我还在深入研究它:
# 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
归功于此source。
docker 1.3和fig
的更新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"]
fig.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_modules
依赖项。这假设我已经在我的主机上安装了npm,这样任何私有包都可以工作。此外,这适用于npm链接,您只需要在容器中将/home/linkedProject
的符号链接添加到$NODE_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 /home \
-v /path/to/NODE_PATH \
--name myvols myNodeImage echo Creating my volumes
运行我的安装脚本:cd ~/data/myProject && ./bin/install
运行我的运行脚本:nodemon -x bin/run
答案 3 :(得分:0)
Docker可以帮助进行Web开发的几种方案:
在本地快速提供所有不同类型的服务。你想要一个干净的couchdb,运行docker run -d -p 5984:5984 tutum/couchdb
; mysql,没问题:docker run -d -p 3306:3306 tutum/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图像,并通过将应用程序目录挂载为卷来创建容器,你可以运行多个彼此隔离的容器。看看我的keystonejs-example项目,了解如何使用mongodb运行复杂的节点应用程序,只需几秒钟即可完成0配置。思考一个更复杂的模型:负载均衡器+应用程序+数据库+缓存,以旧式的方式,有大量的配置选项适合设置过程,但是,如果您将它们配置为单独的容器和link them by names,组件可以通过本地环境变量发现彼此,就像本地PaaS一样。
通过搜索docker index轻松使用应用程序。例如,有一个称为Heartbleed checker的简洁工具,您可以通过单个命令快速下载/使用它在一个容器中,即使不需要考虑配置,下载语言运行时,配置,卸载等等。
根据boot2docker,我假设您使用的是OSX,因此您最好选择支持hostonly网络配置的版本v0.9.2 +,然后您可以通过hostonly网络访问VM内部运行的容器。