在开发工作流程中使用docker

Abd*_*aly 11 node.js docker boot2docker

我在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
Run Code Online (Sandbox Code Playgroud)

更新:添加了我最终做的答案.

更新:使用boot2docker 1.3+和图2添加了更多当前答案.

mba*_*emy 7

你的问题非常有趣,而且(部分)与Docker没有特别的关系.我要说这里的主要和最后一个问题是使用虚拟机.

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

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

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

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


  • 然后,您必须告诉您的Docker容器使用绑定到boot2docker 的Volume(docker术语),并将Docker应用程序指向它:
   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


  • 让NodeJ检测文件变化是另一个挑战.您需要一个额外的包装器来观察文件系统并在代码更改时重新启动Node(Forever,Nodemon ...).

  • 而且,在这之后,因为更改不会出现在本地文件系统,但在一个共享文件夹,你可能要告诉观察者的NodeJS(永远/ Nodemon/...)使用轮询模式.它工作(或多或少)但会烧掉很多CPU.

  • 是的,这就是为什么我说在我看来,当您想要共享或部署您的工作时,重建图像可能会发生:这种情况发生的频率低于每次编辑文件后的情况. (2认同)
  • 是的,几乎所有东西都会被缓存,但是在一天结束时你最终会得到数百个缓存的中间图像.顺便说一下,如果你不想部署它,那么在每次更改后重建图像会有什么意义呢? (2认同)

mat*_*tes 5

关于VirtualBox的共享文件夹,请查看:

boot2docker与VirtualBox Guest Additions一起
如何将/ Users挂载到boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr使用VirtualBox Guest Additions构建您自己的自定义boot2docker.iso(请参阅链接)或下载 http://static.dockerfiles.io/boot2docker-v1.1.0-virtualbox-guest-additions-v4.3.12.iso 并保存到〜/ .boot2docker/boot2docker.iso.

编辑:更新到boot2docker v1.1.0的链接


Abd*_*aly 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
Run Code Online (Sandbox Code Playgroud)

在我的项目根目录中,我只需运行:

nodemon -x bin/run
Run Code Online (Sandbox Code Playgroud)

这要归功于这个来源。

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"]
Run Code Online (Sandbox Code Playgroud)

这fig.yml:

app:
    image: myNodeImage
    working_dir: /home/myProject
    volumes_from:
     - myvols
Run Code Online (Sandbox Code Playgroud)

这是新的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
Run Code Online (Sandbox Code Playgroud)

我还有一个执行依赖项安装bin/install的脚本node_modules。这假设我已经在我的主机上完成了 npm 安装,以便任何私有包都可以工作。另外,这对于 npm 链接非常有效,您只需在容器中创建一个从/home/linkedProjectinto 的符号链接即可。$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
Run Code Online (Sandbox Code Playgroud)

因此,为了将所有这些放在一起,请按顺序执行以下步骤:

  1. 创建我的数据卷容器:

    docker run -v $HOME/data:/data:ro \ -v /home \ -v /path/to/NODE_PATH \ --name myvols myNodeImage echo Creating my volumes

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

  3. 运行我的运行脚本:nodemon -x bin/run