【问题标题】:Where should i run my grunt build step when building my docker image for staging and production environments?在为暂存和生产环境构建 docker 映像时,我应该在哪里运行 grunt 构建步骤?
【发布时间】:2015-10-18 13:38:36
【问题描述】:

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

我目前的工作流程如下:

  • 将分支推送到 github
  • CircleCI 安装所有依赖项、构建项目并在分支上运行测试。
  • 将分支分支合并到暂存分支
  • CircleCI 安装所有依赖项、构建项目并在分支上运行测试。
    • 如果测试通过,将构建的文件与源代码一起打包到 docker 镜像中,并运行npm install --production。 CircleCI 然后将此staging image 部署到 dockerhub
  • Tutum 链接到 dockerhub 并在每次推送新映像时将我的映像部署到 DigitalOcean。

当合并到 master 时,我执行与上述相同的工作流程,并改为创建 production image

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

我见过很多人在他们的 dockerfile 中包括 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"]

【问题讨论】:

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


    【解决方案1】:

    运行构建步骤和构建 docker 映像的最佳做法是什么?是让 CI 做更好,还是 dockerhub 从 dockerfile 做更好?

    最好在 docker 之外自行运行构建步骤。因此,相同的步骤适用于本地开发、非 docker 部署等。尽可能保持与 docker 本身的耦合松散。因此,使用常规构建工具和脚本构建您的工件,并通过您的 Dockerfile 简单地将文件 ADD 构建到您的 docker 映像。

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

    我建议您完全使用您已经在生产阶段构建和测试的映像。重建映像后,即使您的舞台映像工作正常,您也容易受到破坏生产映像的差异的影响。在这一点上,docker 和 npm 都不能跨时间提供严格可重复的构建,因此一旦构建并测试黄金,它就是黄金,并且一点一点地投入生产。

    【讨论】:

    • 啊,好吧,所以我在使用 CI 运行构建的正确轨道上。我出错的地方是 ADD 步骤。我认为我对应该如何使用 Docker 缺乏基本的了解。目前(如您在上面看到的),我将整个应用程序目录复制到图像中。我的理解是这会产生 2 个单独的图像,因为 Staging 将在 Production 之前提交,而 Production 是基于 master 分支的。我正在努力掌握将代码注入同一图像的阶段和生产过程。你能看到我哪里出错并提出建议吗?
    • 我已经添加了我的 circle.yml 文件,这样你就可以在 CircleCI 上看到我现在在做什么。我真的很感谢你梳理它并指出我哪里出错了,我应该把它改成什么,因为我现在感觉很迷茫,而且大多数网上的文章似乎都把构建做错了进入dockerfile。谢谢@peter-lyons!
    【解决方案2】:

    您的圈子 ci 应该下载所有依赖项,然后从下载的包创建 docker 映像。所有测试都通过指定的依赖项,并应转至生产环境。一次。镜像被推送到包含所有依赖项的 docker hub,tumtum 会将其部署到您的生产环境中,并且由于已经下载了依赖项,因此创建容器需要几秒钟的时间。

    回答您构建相同图像的第二个查询。我建议将相同的图像部署到生产中。这将向您保证,在登台上效果很好的东西在生产上也同样有效。

    【讨论】:

    • 您能否为我提供一个示例 Dockerfile 以及您所提议的 CircleCI 的一些伪步骤?在您说“所有测试都通过指定的依赖项并应继续用于生产。一次。”之后,我对这些步骤有点迷茫。
    • 有一个关于复数视觉的精彩视频,展示了如何使用 tutum 和 circle ci 将 docker 容器部署到生产环境
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2020-10-06
    • 2019-09-21
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多