【发布时间】:2015-10-18 13:38:36
【问题描述】:
在构建我的 docker 映像并部署到 dockerhub 时,我真的很难弄清楚我应该把我的 grunt 构建步骤放在哪里。
我目前的工作流程如下:
- 将分支推送到 github
- CircleCI 安装所有依赖项、构建项目并在分支上运行测试。
- 将分支分支合并到暂存分支
- CircleCI 安装所有依赖项、构建项目并在分支上运行测试。
- 如果测试通过,将构建的文件与源代码一起打包到 docker 镜像中,并运行
npm install --production。 CircleCI 然后将此staging image部署到 dockerhub
- 如果测试通过,将构建的文件与源代码一起打包到 docker 镜像中,并运行
- Tutum 链接到 dockerhub 并在每次推送新映像时将我的映像部署到 DigitalOcean。
当合并到 master 时,我执行与上述相同的工作流程,并改为创建 production image。
我创建了 2 个单独的 docker 图像感觉有点奇怪。这是标准做法吗?
我见过很多人在他们的 dockerfile 中包括 grunt/gulp 构建步骤,但这感觉也不对,因为所有的 devDependencies 和 bower_components 都将与构建的代码。
运行构建步骤和构建 docker 映像的最佳做法是什么?是让 CI 做更好,还是 dockerhub 从 dockerfile 做更好?我也在寻找最有效的方法来创建用于暂存和生产的 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"]
【问题讨论】:
标签: node.js deployment docker continuous-integration docker-compose