在为登台和生产环境构建docker镜像时,我应该在哪里运行我的grunt构建步骤?

时间:2015-10-18 13:38:37

标签: node.js deployment docker continuous-integration docker-compose

在构建我的docker镜像并部署到dockerhub时​​,我真的很难弄明白我应该把我的grunt构建步骤放在哪里。

我目前的工作流程如下:

  • 将分支推送到github
  • CircleCI安装所有依赖项,构建项目,并在分支上运行测试。
  • 将分支分支合并到分段分支
  • CircleCI安装所有依赖项,构建项目,并在分支上运行测试。
    • 如果测试通过,请将构建的文件打包到包含源的docker镜像中,并运行npm install --production。然后,CircleCI将此staging image部署到dockerhub
  • 每当推送新图片时,Tutum都会链接到dockerhub并将我的图片部署到DigitalOcean。

我执行与上面相同的工作流程,合并为母版时,而是创建了production image

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

我见过很多人,包括他们的dockerfiles中的grunt / gulp构建步骤,但是感觉不对,因为所有devDependenciesbower_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"]

2 个答案:

答案 0 :(得分:1)

  

运行构建步骤和构建docker镜像的最佳做法是什么?让CI做到这一点更好,或者dockerhub是否可以从dockerfile中做到这一点?

最好在docker之外运行构建步骤。因此,相同的步骤适用于本地开发,非停靠器部署等。尽可能保持耦合器与docker本身松散。因此,使用常规构建工具和脚本构建工件,并通过ADDDockerfile构建的文件构建到docker镜像。

  

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

我建议改为使用您已在生产舞台上构建和测试的图像。重建图像后,即使您的舞台图像工作正常,也很容易出现打破生产图像的差异。在这一点上,docker和npm都不能提供跨时间严格可重复的构建,因此一旦它构建并测试了黄金,它就是黄金,并且逐点地生产。

答案 1 :(得分:0)

您的圈子ci应该下载所有依赖项,然后从下载的包中创建docker镜像。所有测试都以指定的依赖关系传递,并应转发到生产环境。一旦。图像被推送到具有所有依赖关系的docker hub,而tumtum将将其部署到您的生产中,并且由于已经下载了依赖项,因此创建容器需要几秒钟。

回答第二次构建相同图片的问题。我建议将相同的图像部署到生产中。这将保证您在升级时工作得很好,在生产中也是如此。