我在哪里build立我的docker图像的阶段和生产环境运行我的咕build生成步骤?

当我build立我的docker镜像并部署到dockerhub时​​,我真的很费力地找出我应该把我的咕build生成步骤。

目前我的工作stream程如下:

  • 推分支到github
  • CircleCI安装所有依赖项,构build项目,并在分支上运行testing。
  • 合并分支到分段分支
  • CircleCI安装所有依赖项,构build项目,并在分支上运行testing。
    • 如果testing通过,则将构build的文件与源代码打包到docker映像中,并运行npm install --production 。 CircleCI然后将这个staging image部署到dockerhub
  • Tutum链接到dockerhub,并将图像部署到DigitalOcean每当一个新的图像被推动。

当合并到主设备上时,我将执行与上述相同的工作stream程,而创buildproduction image

这感觉有点奇怪,我创build了2个独立的docker图像。 这是标准的做法吗?

我已经看到了很多人,包括他们的dockerfiles中的grunt / gulp构build步骤,但是这并不正确,因为所有devDependenciesbower_components都会随着构build的代码一起在映像中。

运行构build步骤和构build泊坞窗图像的最佳做法是什么? CI是做得更好还是dockerhub从docker文件中做得更好? 我也是最有效的方式来创build我的docker形象进行舞台和生产。

下面是我的circleCI.yml文件,后面跟着我的Dockerfile。

circle.yml:

 machine: node: version: 4.2.1 # Set the timezeone - any value from /usr/share/zoneinfo/ is valid here timezone: Europe/London services: - docker pre: - sudo curl -L -o /usr/bin/docker 'http://s3-external-1.amazonaws.com/circle-downloads/docker-1.8.2-circleci'; sudo chmod 0755 /usr/bin/docker; true dependencies: pre: - docker --version - sudo pip install -U docker-compose==1.4.2 - sudo pip install tutum override: - npm install: pwd: node post: - npm run bower_install: pwd: node - npm run grunt_build: pwd: node test: override: - cd node && npm run test deployment: staging: branch: staging commands: - docker-compose -f docker-compose.production.yml build node # - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - tutum login -u $DOCKER_USER -p $DOCKER_PASS -e $DOCKER_EMAIL - docker tag dh_node:latest tutum.co/${DOCKER_USER}/dh_stage:latest - docker push tutum.co/${DOCKER_USER}/dh_stage:latest master: branch: master commands: - docker-compose -f docker-compose.production.yml build node # - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - tutum login -u $DOCKER_USER -p $DOCKER_PASS -e $DOCKER_EMAIL - docker tag dh_node:latest tutum.co/${DOCKER_USER}/dh_prod:latest - docker push tutum.co/${DOCKER_USER}/dh_prod:latest 

Dockerfile:

 FROM node:4.2 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install --production COPY . /usr/src/app # # # Commented the following steps out, as these # now run on CircleCI before the image is built. # (Whether that's right, or not, i'm not sure.) # # Install bower # RUN npm install -g bower # grunt-cli # # WORKDIR src/app # RUN bower install --allow-root # # Expose port EXPOSE 3000 # Run app using nodemon CMD ["npm", "start"] 

运行构build步骤和构build泊坞窗图像的最佳做法是什么? CI是做得更好还是dockerhub从docker文件中做得更好?

在Docker之外运行构build步骤更好。 因此,相同的步骤适用于本地开发,非docker部署等。当你可以的时候,保持你的耦合到docker本身。 因此,使用常规的构build工具和脚本来构build工件,并通过Dockerfile将构build的文件简单地ADD到您的Dockerfile

这感觉有点奇怪,我创build了2个独立的docker图像。 这是标准的做法吗?

我会build议使用完全在生产舞台上已经build立和testing的图像。 一旦重build图像,即使您的舞台图像工作正常,您也很容易破坏您的制作图像。 在这一点上,docker和npm都不能随着时间的推移提供严格的可复制的构build,因此一旦构build和testing黄金,它就是黄金,并且进行一点一点的生产。

你的圈子ci应该下载所有的依赖关系,然后从下载的包创builddocker镜像。 所有testing都通过指定的依赖关系传递给生产。 一旦。 该图像被推送到docker集线器与所有依赖关系和tumtum将部署到您的生产相同,因为已经下载的依赖关系,将需要几秒钟来创build容器。

回答你的第二个查询build立相同的图像。 我会build议部署相同的图像生产。 这可以保证你在舞台上的performance也是一样的。