【问题标题】:Is it even possible to convert my docker-compose.yml to heroku.yml?甚至可以将我的 docker-compose.yml 转换为 heroku.yml 吗?
【发布时间】:2021-07-12 06:48:42
【问题描述】:

所以我正在尝试将我的应用程序部署到 Heroku。 这是我的 docker-compose.yml

version: '3'

#Define services
services:

  #Back-end Spring Boot Application
  entaurais:
    #The docker file in scrum-app build the jar and provides the docker image with the following name.
    build: ./entauraIS
    container_name: backend
    #Environment variables for Spring Boot Application.
    ports:
     - 8080:8080 # Forward the exposed port 8080 on the container to port 8080 on the host machine
    depends_on:
    - postgresql

  postgresql:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=postgres
      - POSTGRES_DB=entauracars
    ports:
      - "5433:5433"
    expose:
      - "5433"

  entaura-front:
    build: ./entaura-front
    container_name: frontend
    ports:
      - "4200:4200"
    volumes:
      - /usr/src/app/node_modules

我的前端 Dockerfile:

FROM node:14.15.0
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY package*.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 4200
CMD [ "npm", "start" ]

我的后端 Dockerfile:

FROM maven:3.6.0-jdk-11-slim AS build
COPY src /usr/src/app/src  
COPY pom.xml /usr/src/app  
RUN mvn -f /usr/src/app/pom.xml clean package

FROM openjdk:11-jre-slim
COPY --from=build /usr/src/app/target/entauraIS.jar /usr/app/entauraIS.jar
ENTRYPOINT ["java","-jar","/usr/app/entauraIS.jar"]

据我所知,heroku 需要它自己的 heroku.yml 文件,但是对于我看到的示例,我不知道如何将其转换为我的情况。任何帮助都会得到帮助,我完全迷失了 Heroku。

我看过的 heroku.yml 的一个例子:

build:
  docker:
    web: Dockerfile
run:
  web: npm run start
release:
  image: web
  command:
    -npm run migrate up

【问题讨论】:

  • 您的所有应用程序(api 和前端)都可以在您的本地主机中使用 docker
  • 在我的本地机器上运行时一切正常

标签: docker heroku


【解决方案1】:

docker-compose.yml 到 heroku.yml

docker-compose 有一些与 heroku.yml 类似的字段。您可以手动创建。

创建一些 npm 模块来将 docker-compose 转换为 heroku.yml 会很棒。你只需要阅读 docker-compose.yml 并选择一些值来创建一个 heroku.yml。查看this了解如何读写yml文件。

docker is not required in heroku

如果您正在寻找一个平台来部署您的应用程序并避免基础架构噩梦,heroku 是您的选择。

更重要的是,如果您的应用程序是标准的(java 和 nodejs),不需要疯狂的配置来构建并且是自包含的(没有私有库),那么您不需要 docker :D

如果你的 nodejs package.json 有标准脚本:启动和构建,它将在 heroku 中运行,只需在没有 Dockerfile 的情况下对 heroku 执行git push。 Heroku 将检测 nodejs、版本和您的应用程序将启动。

如果你的 java 有 spring-boot 标准配置,也是一样的,只需将你的代码推送到 heroku。在这种情况下,在推送之前,手动添加 postgress 插件并在 application.properties jdbc url 中使用环境变量

one process by app in heroku

如果你有 api + 前端,你将需要 heroku 中的两个应用程序。此外,您的 api 将需要 postgress 插件

Heroku 不像 docker-compose 那样工作,我的意思是:一个主机包含所有应用程序:front + api + db

码头工人

如果要使用 Docker,只需将 Dockerfile 和 git push 放入即可。 Heroku 将检测到需要 docker 并执行标准命令:docker build ... docker run... 所以,不需要额外的配置

heroku.yml

如果您的应用程序必须使用 Docker,而标准的 docker build ... 和 docker run... 对于您的应用程序来说还不够,您将需要 heroku.yml

heroku 中的每个应用都需要一个 heroku.yml。

这样做的一个好处可能是不需要手动添加 postgress 插件,因为它在 heroku.yml 中定义

【讨论】:

  • 所以如果我想运行 3 个容器(前端、后端和 postgresql),这是否意味着我需要将它们作为 3 个单独的应用程序运行?他们之间的交流会不会是一场噩梦?抱歉,这让我很困惑。在我的情况下需要使用 docker,而 docker-container 让我同时启动所有内容。您认为让公众可以访问该应用的最佳选择是什么?
  • 您听说过分布式系统吗?同一主机中的 Java 应用程序和数据库进程仅用于开发或测试目的。在实际或生产环境中,数据库必须在单独的主机中,后端 api 在另一台主机中,前端是在另一台主机中。这是最新的方法,heroku 或 docker 和其他技术就是为此而设计的。正如您所说,docker-compose 让您同时启动所有内容。这很好,但对于开发或测试,也不用于生产。可能在非常有限的生产环境中容易出现许多错误
  • 您的应用程序只是您工作中的一个 poc、一些家庭作业还是一个面向真实用户的应用程序?在所有情况下,最简单的方法是 heroku。如果您的应用程序是标准的,则不需要 docker。从开发到生产,heroku 都是不错的选择。另一个复杂的选择可能是将 amazon、azure 或 gcp 与 docker 和 kubernetes 一起使用。
  • 这是一个不会看到任何真实用户的个人项目。我只是想以某种方式在其中实现 docker,但我可能在这里过头了。
  • 是的。对于您当前的方法,不需要 docker。首先在 heroku 中创建一个新应用,添加 postgress 插件并在没有 Dockerfile 的情况下执行 git push。 Heroku 将检测 pom.xml 的存在并确定它是一个 java 应用程序。如果一切正常,请使用 postman 测试您的 api。如果一切正常,heroku 中的一个新应用程序用于前端。这就是你所需要的;)
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多