将docker容器从外部注册表部署到Heroku

时间:2017-03-05 17:30:44

标签: heroku docker continuous-integration gitlab

我在gitlab上托管了项目存储库。我正在使用gitlab-ci从我的项目构建docker容器。我想要实现的是将该容器部署到heroku。

我试图按照这个问题解决问题:How to build, test and deploy using Jhipster, Docker, Gitlab and Heroku

以下是我.gitlab-ci.yaml的样子:

stages:
 - build
 - package
 - deploy

build_npm:
  image: node:latest
  stage: build
  script:
  - npm install
  - npm run build:prod
  artifacts:
    paths:
      - dist/

build_image:
  image: docker:latest
  services:
  - docker:dind
  stage: package
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
    - docker build -t registry.gitlab.com/maciejsobala/myApp .
    - docker push registry.gitlab.com/maciejsobala/myApp:latest


deploy_to_heroku:
  stage: deploy
  services:
  - docker:dind
  script:
    - gem install dpl
    - docker run registry.gitlab.com/maciejsobala/myApp:latest
    - dpl --provider=heroku --app= myApp --api-key=$HEROKU_API_KEY

我想要实现的是,有三个阶段:

  • build:此时,只编译npm项目(将来,我 想在这里添加一些jar
  • package:创建并推送到注册表docker镜像。
  • 部署:在heroku上安装docker image。

我遇到了最后一个阶段的问题(deploy)。说实话,我不太确定,应该在这里做些什么。

我尝试使用dpl,关于本教程:https://docs.gitlab.com/ce/ci/examples/test-and-deploy-ruby-application-to-heroku.html

Unfornatelly我在尝试运行docker image时遇到了问题

$ docker run registry.gitlab.com/maciejsobala/myApp:latest
/bin/bash: line 49: docker: command not found

我在这里完全失明。我真的很感激任何解决方案,链接到文章/教程等。

2 个答案:

答案 0 :(得分:8)

您出于某种原因(使用docker run)启动了应用,但您可能并不需要。 dpl工具旨在用于代码库,而不是用于映像部署。如你所说

build_image:
  image: docker:latest
  services:
  - docker:dind
  stage: package
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
    - docker build -t registry.gitlab.com/maciejsobala/myApp .
    - docker push registry.gitlab.com/maciejsobala/myApp:latest

正在运行,这意味着你的跑步者能够在码头工具中运行码头并成功推送图像。对于heroku部署,您必须根据the official heroku documentation将该图像推送到heroku docker注册表。总之,你做了一个

deploy_to_heroku:
  stage: deploy
  services:
  - docker:dind
  script:
    - docker login --email=_ --username=_ --password=<YOUR-HEROKU-AUTH-TOKEN> registry.heroku.com
    - docker tag registry.gitlab.com/maciejsobala/myApp:latest registry.heroku.com/maciejsobala/myApp:latest
    - docker push registry.heroku.com/maciejsobala/myApp:latest

使用您的heroku身份验证令牌,您可以通过heroku auth:token

获取

如文档中所述,推送到herokus注册表会触发应用程序的发布过程。

答案 1 :(得分:2)

原因

  

“没有这样的图片:registry.gitlab.com/username/image:tag”

错误是标签源应事先拉出。脚本块应包含docker pull语句。总体脚本块应如下所示:

  script:
    - docker login --email=_ --username=_ --password=<YOUR-HEROKU-AUTH-TOKEN> registry.heroku.com
    - docker pull registry.gitlab.com/maciejsobala/myApp:latest
    - docker tag registry.gitlab.com/maciejsobala/myApp:latest registry.heroku.com/maciejsobala/myApp:latest
    - docker push registry.heroku.com/maciejsobala/myApp:latest

但这还不够。 Heroku更改了其发布策略,因此推送到Heroku Container Registry不再触发发布。这是完成丢失的发布任务的额外命令:

    - docker run --rm -e HEROKU_API_KEY=<YOUR-HEROKU-AUTH-TOKEN> wingrunr21/alpine-heroku-cli container:release web --app myApp