どのように、私はDockerの上でgolangをセットアップして、Herokuにそれを配備しますか


ハローリーダー
このポストは、私の最近の痛みポイントの結果として、GolangをDockerの上でセットアップして、Herokuにバックエンドサービスを配備する方法を考え出していました.
時々、昨年、私はゴランを渡ってきました.私はノードから来ました.JSの背景とgolang興味の特徴を発見した.
私は今までのところ、プロジェクトを構築するなどの特定の障害を克服している今、私はドメイン駆動開発の大ファンです.
それは私に私のプロジェクトを設定するための私の最初の試みだったbuild in one place, run on any platform 解決法
まず、開発のための設定方法.

# Start from golang base image
FROM golang:alpine as builder

# Add Maintainer info
LABEL maintainer="Fakorede Boluwatife"

# Install git.
# Git is required for fetching the dependencies.
RUN apk update && apk add --no-cache git

# Set the current working directory inside the container 
WORKDIR /app

# Copy go mod and sum files 
COPY go.mod go.sum ./

# Download all dependencies. Dependencies will be cached if the go.mod and the go.sum files are not changed 
RUN go mod download 

# Copy the source from the current directory to the working Directory inside the container 
COPY . .

# Build the Go app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd

# Start a new stage from scratch
FROM alpine:latest
RUN apk --no-cache add ca-certificates

WORKDIR /root/

# Copy the Pre-built binary file from the previous stage.
COPY --from=builder /app/main .
COPY --from=builder /app/.env .
COPY --from=builder /app/templates ./templates
COPY --from=builder /app/pkg ./pkg
COPY --from=builder /app/migrations ./migrations
# COPY --from=builder /app/tls ./tls


# Expose port to the outside world
EXPOSE 4000

#Command to run the executable
CMD [ "./main" ]

上記のコードはデフォルトですDockerfile.dev そして、それは多段ビルドのDockerファイルです、そして、それは各々のステップを理解するためによくコメントされます.私の名前Dockerfile.dev 単に私が使用する必要があるのでDockerfile ちょうど小さな変化で生産のためのそれ自体.
ビルドの2番目の段階では、ビルド失敗を防ぐために、初期作業ディレクトリにないファイルを簡単に削除(またはコメントアウト)できます.
現在、私はPostgreSQLとともに働いていて、Dockerコンテナで私のGolangアプリケーションと一緒に使う方法が必要です.
ドッカーは私の救助に来た.
私は、私が私のDocker構成ファイルを走らせるならば、自動移行をセットアップするのも好きです.
私のDockerの作成ファイルはこのように見えます.
version: '3'
services:
  postgres_database:
    environment:
      - POSTGRES_USER=${DATABASE_USER}  
      - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
      - POSTGRES_DB=${DATABASE_NAME}
      - DATABASE_HOST=${DATABASE_HOST}
    build: ./migrations/postgres
    ports:
      - 5432:5432
  app:
    container_name: test-app
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - api:/usr/src/app/
    ports:
      - "4000:4000"
    depends_on:
      - postgres_database

あなたが気づくならばpostgres_database サービスはDockerfile 移行フォルダで.
下記のイメージ

わかりました.
また、各フォルダのSQLコマンドを保持するテーブルフォルダが含まれます.
次に、テーブルコマンドはdeploy_schemas.sql ファイル.
下記のイメージ

まだできていません.
The Dockerfile ( Dockerの使用では以下のようなコマンドを実際に保持します:

それは単にDockerハブからの最新のPostgresを得ますdocker-entrypoint-initdb.d/tables それからdeploy_schemas.sql ファイルdocker-entrypoint-initdb.d .
P :The `docker-entrypoint-initdb.d` will only run the first time when it is not set, hence you have to run a docker-compose down command then `docker-compose up --b` to create the latest table migrationsまた、適切な環境変数を設定することを忘れないでくださいDATABASE_USER , DATABASE_PASSWORD , DATABASE_NAME and DATABASE_HOST .
そのあと、docker-compose up --b そして、あなたは開発のために設定されます.
Herokuの生産展開について話しましょう.
私は生産環境変数を生産用途にコピーする適切な方法を見つけることができませんでした.
Herokuでは、単に展開する前に環境変数を設定します.Dockerfile.dev 新たにDockerfile しかし、削除.envファイルは、テストや開発環境変数の生産を実行しないようにします.
このようにDockerfile 以下のようになります.

# Start from golang base image
FROM golang:alpine as builder

# Add Maintainer info
LABEL maintainer="Fakorede Boluwatife"

# Install git.
# Git is required for fetching the dependencies.
RUN apk update && apk add --no-cache git

# Set the current working directory inside the container 
WORKDIR /app

# Copy go mod and sum files 
COPY go.mod go.sum ./

# Download all dependencies. Dependencies will be cached if the go.mod and the go.sum files are not changed 
RUN go mod download 

# Copy the source from the current directory to the working Directory inside the container 
COPY . .

# Build the Go app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd

# Start a new stage from scratch
FROM alpine:latest
RUN apk --no-cache add ca-certificates

WORKDIR /root/

# Copy the Pre-built binary file from the previous stage.
COPY --from=builder /app/main .
COPY --from=builder /app/templates ./templates
COPY --from=builder /app/pkg ./pkg
COPY --from=builder /app/migrations ./migrations
# COPY --from=builder /app/tls ./tls


# Expose port to the outside world
EXPOSE 4000

#Command to run the executable
CMD [ "./main" ]

正確にDockerfile.のないdev ...ENVは2番目のビルド段階でコピーされました.MAKE SURE YOU USE CMD instead of ENTRYPOINT このように実行可能ファイルを実行するには、Herokuで実行するアプリケーションに対して必須です.
また、メインのポートを確認してください.ゴーはAを使っている":" + $PORT . これはHerokuによって自動的に設定され、あなたはそれについて心配する必要はありません.あなたのdevelopment environment ただし、$ port変数を設定するのを忘れないでください.envファイル.
herokuでプロジェクトを設定する必要があります(heroku createを使用してこれを行うこともできます).
私はHerokuで私のデータベースを移行するためにDockerを使用しませんでした、私がHerokuの上で私のアプリケーションを降ろすならば、私は私のデータベースのすべてのデータを失うつもりです、そして、それはあまりに危険です.
したがって、私のデータベースは、私のDockerfileから生産に分かれています.
データベースの資格情報を含むHeroku上のすべての環境変数を設定することを忘れてはいけません(あなたのデータベースのアドオンセクションで見つけることができます)Heroku Postgres(あなたがそれを使用している場合)をクリックし、設定を追加します.
DockerとHerokuの美しさは、配置の容易さです.
4つの簡単なコマンドを使用すると、アプリケーションが稼働している.
アプリケーションのディレクトリに

1. `Heroku login` (you need to login into the Heroku-cli) 

PS: If you don't have the heroku-cli installed, you need to install following:

`https://devcenter.heroku.com/articles/heroku-cli`

2. `heroku container:login` This allows you to login into the heroku container.

3. `heroku container:push web -a <name-of-your-heroku-project>`

On the success of step 3,

4. `heroku container:release web -a <name-of-your-heroku-project>`.

That is all!

Your project is running on Heroku perfectly.

Incase you experience any bug, run:

`heroku logs --tail -a <name-of-your-heroku-project>`

 This helps you to identify the issue and gives you the first step to debugging.

私はこのプロセスを改善する多くの方法があることを知っています、そして、私は改善に関するもう一つの記事を書きます.あなたの提案を歓迎します.
お読みありがとうございます.