Go , Dockerとgitlabの簡単な設定


それは何ですか?


私は数日前にGO言語を学び始めました.サービスは静的サーバとしての画像処理と配送についてです.私は後でこのサービスについての短いケーススタディを書くつもりです.👌
コンテナのファンとして、開発環境をDockerコンテナに入れます.私は言語がとても好きで、MVPを本当に速く書くことができました.私がされたとき私はGitlab CIを使用して私のアプリの公開Dockerのイメージについていくつかのインスピレーションを得ることを決めた.いくつかのベストプラクティスや警告を得るために.
そして、私は、私が見つけた複雑な(または時代遅れの)Configsが本当に驚きました.

私はなぜ私はそれらと時間を失うのか?私はプラットフォーム固有のビルドを行う必要はありませんので、アプリケーションを実行しているgitlabパスや他の同様の奇妙なものにenvsを注入します.
私自身のためにそれを書いて、それをここに示すつもりです.Go、DockerやMicroServicesに興味がある人にとって役に立つでしょう.✌️

Dockerで簡単に行くアプリ


私は、あなたには少なくとも全体としてDockerまたはContainerizationに関する若干の基本的な知識があると仮定します.しかし、私はあなたの多くは初心者も管理すると思います.💪
  • まず、コンテキストを得るためにプロジェクトの仕組みを紹介します.
  • それから、私はどのようにGOアプリの開発Docker環境を準備して書くつもりです.
  • 最後に、私はgitlab CIを使用して建物の生産行くアプリのDocker画像を示します.
  • プロジェクト構造


    私を誤解しないでください、この構造は何千ものうちの1つです.そして、私はそれがあなたが使うべき最高のものまたは1であると言っていません.私はちょうどこれに慣れているので、ほとんどどこでも使用しています.
    それはちょうどあなたがパスがどこから来るかわかっているように、構成ファイル文脈にあなたを得ます.
    .
    ├── bin # helper docker-compose scripts
    │   ├── build
    │   ├── go
    │   └── start
    ├── dev-ops
    │   ├── dev.Dockerfile
    │   ├── docker-compose.yml
    │   └── prod.Dockerfile
    ├── README.md
    └── source # go source files
        ├── crop.go
        ├── delivery.go
        ├── go.mod
        ├── go.sum
        ├── main.go
        └── vendor # app's go dependencies source files
    

    Dockerの開発


    我々のアプリのdevイメージを準備する必要があります.
    からビルドgolang alpine image , どれがより軽くて、私が必要とするすべてを持ちます.
    見ることができるwatcher コマンド.Watcherは、名前は言うように、その時計は、ツールです.go 変更時にファイルを変更し、コードをビルドします.したがって、私たちは毎回端末で手動でそれをする必要はありません.
    ## ./dev-ops/dev.Dockerfile
    
    FROM golang:1.15-alpine3.12
    
    ## Make app dir for source files
    ## Get git binary so that GO can download dependencies
    RUN mkdir /app \
        && apk add git
    
    ## Set app folder as work directory (default context in Docker container)
    WORKDIR /app
    
    ## get and install watcher
    RUN go get github.com/canthefason/go-watcher \
        && go install github.com/canthefason/go-watcher/cmd/watcher
    
    ## Turn on Go modules, it allows easier dependency managment
    ## Copy files with modules (dependencies) requirements, so that GO knows what to download
    ## Reminds me package.json and yarn.lock in JS development
    ENV GO111MODULE=on
    ADD ./source/go.mod /app
    ADD ./source/go.sum /app
    
    ## pull in all modules (dependencies)
    RUN go mod download
    
    ## Add source files to image work directory
    ADD ./source /app
    
    ## Command which applies when container from this image runs
    CMD ["watcher"]
    
    ウォッチャーのような同様の試みツールもたくさんあります.例えばジンまたはフレッシュ.または、あなたは、JMS環境から来た人々のために、nodemonを使うこともできます🙂)
    そして、私たちの行くアプリでDockerコンテナを実行するためのDocker構成ファイルがあります.
    ## ./dev-ops/docker-compose.yml
    
    version: '3'
    services:
      ## ids is image delivery service (the service I wrote)
      ids:
        ## name of our image built from dev.Dockerfile above
        image: registry.gitlab.com/dashers/image-delivery-service/ids:dev
        container_name: dasher_ids
        ## sync your local source files with those in container
        volumes:
          - ../source/:/app/
    ...
    

    DockerとGitlab CIで生産を行ってください


    今、我々は生産Dockerイメージを準備します.
    再び、それは以前と同じ理由のためにゴラン山のイメージから造られます.
    ## ./dev-ops/prod.Dockerfile
    
    FROM golang:1.15-alpine3.12
    
    RUN apk add git
    
    WORKDIR /go/src/gitlab.com/dashers/image-delivery-service
    
    ## same as in dev... add files with dependencies requierments
    ENV GO111MODULE=on
    ADD ./go.mod .
    ADD ./go.sum .
    
    ## pull in any dependencies
    RUN go mod download
    
    ## add source files
    ADD . .
    
    ## our app will now successfully build with the necessary go dependencies included
    ## creates ./main binary executable file
    RUN go build -o main .
    
    ## runs our newly created binary executable
    CMD ["./main"]
    
    簡単右?gitlab ci configを見てみましょう.
    私はちょうど1つのステージを示しています-構築して、発表してください.それは我々のビルドprod.Dockerfile そして、それがプルのために利用できるGitlabコンテナ・レジストリへのイメージを発表します.
    ## ./gitlab-ci.yml
    
    image: docker:stable
    
    variables:
      # SET DEFAULT BEHAVIOR FOR CI
      # Disable submodules on CI, we are not using submodules
      GIT_SUBMODULE_STRATEGY: none
    # important! we need to say gitlab that we run docker container in docker container..
    services:
      - docker:dind
    
    stages:
      - BUILD and PUBLISH
    
    ## template for build and publish stage
    .build-and-publish_template: &build-and-publish_template
      stage: BUILD and PUBLISH
      ## I version project using commit tags. 
      ## Here I say I want to trigger the stage only if commit tag has format ids-x.x.x
      rules:
        - if: $CI_COMMIT_TAG =~ /^(ids)-[0-9]+\.[0-9]+\.[0-9]+$/
          when: always
        - when: never    
      before_script:
        # accept ids-0.0.1 => 0.0.1 | master => master
        - VERSION=$(if [ "$CI_COMMIT_TAG" == "" ]; then echo $CI_COMMIT_REF_NAME; else echo $CI_COMMIT_TAG |awk -F- '{print $2}'; fi)
        - echo $VERSION
            # login to gitlab container registry
        - echo -n $CI_REGISTRY_PASSWORD | docker login --username $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
      after_script:
        # clean up
        - docker logout $CI_REGISTRY
    
    ## build and publish stage (using the template above)
    ids - build and publish: 
      <<: *build-and-publish_template
      script:
        # build our production image (prod.Dockerfile)
        # registry.gitlab.com/dashers/image-delivery-service/ids:x.x.x
        - >
          docker build \
            --network host \
            --tag ${CI_REGISTRY}/dashers/image-delivery-service/ids:${VERSION} \
            --file ${CI_PROJECT_DIR}/dev-ops/prod.Dockerfile \
            --rm \
            ${CI_PROJECT_DIR}/source
    
        # publish into docker registry
        - docker push ${CI_REGISTRY}/dashers/image-delivery-service/ids:${VERSION}
    
    それだ!🎉
    今すぐDockerを作成することができます作成することができます私はあなたの生産サーバーでは、ボリュームのセクションを使用して、GitLabレジストリから画像を使用して、コンテナを実行し、あなたの試みのアプリは準備ができて実行している.
    プロジェクト全体の設定を見たり、多分私たちのサービスを使用したいなら、gitlabhere .
    コメント、フィードバックや質問に自由に✌️
    良い一日を!