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

Mac*_*der 5 continuous-integration heroku gitlab docker

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

我试图遵循这个问题的解决方案:如何使用Jhipster,Docker,Gitlab和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
Run Code Online (Sandbox Code Playgroud)

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

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

我遇到了最后阶段的问题(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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*man 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
Run Code Online (Sandbox Code Playgroud)

什么意思是你的跑步者能够在码头工人中运行码头并成功推送图像.根据官方的heroku文档,对于heroku部署,您只能将该图像推送到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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 另一件需要注意的事情是 Heroku 注册表路径是 `registry.heroku.com/{app-name}/{process-type}`,你可以将它与 `docker push` 一起使用 - 或者 - 你可以使用 Heroku CLI 工具,例如`heroku container:push {process-type}` 他们最近还改变了容器部署方法,因此一旦你推送了一个镜像,还有另一个步骤需要发布。`heroku container:release {process-type}` [Heroku - 构建和推送镜像](https://devcenter.heroku.com/articles/container-registry-and-runtime#building-and-pushing-image-s) (2认同)

Ome*_*lan 7

的原因

“没有这样的图像: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
Run Code Online (Sandbox Code Playgroud)

但这还不够。Heroku 更改了其发布政策,以便推送到 Heroku Container Registry 不再触发发布。这是完成缺少的发布任务的额外命令:

    - docker run --rm -e HEROKU_API_KEY=<YOUR-HEROKU-AUTH-TOKEN> wingrunr21/alpine-heroku-cli container:release web --app myApp
Run Code Online (Sandbox Code Playgroud)