Go , Dockerとgitlabの簡単な設定
10283 ワード
それは何ですか?
私は数日前にGO言語を学び始めました.サービスは静的サーバとしての画像処理と配送についてです.私は後でこのサービスについての短いケーススタディを書くつもりです.👌
コンテナのファンとして、開発環境をDockerコンテナに入れます.私は言語がとても好きで、MVPを本当に速く書くことができました.私がされたとき私はGitlab CIを使用して私のアプリの公開Dockerのイメージについていくつかのインスピレーションを得ることを決めた.いくつかのベストプラクティスや警告を得るために.
そして、私は、私が見つけた複雑な(または時代遅れの)Configsが本当に驚きました.
私はなぜ私はそれらと時間を失うのか?私はプラットフォーム固有のビルドを行う必要はありませんので、アプリケーションを実行しているgitlabパスや他の同様の奇妙なものにenvsを注入します.
私自身のためにそれを書いて、それをここに示すつもりです.Go、DockerやMicroServicesに興味がある人にとって役に立つでしょう.✌️
Dockerで簡単に行くアプリ
私は、あなたには少なくとも全体としてDockerまたはContainerizationに関する若干の基本的な知識があると仮定します.しかし、私はあなたの多くは初心者も管理すると思います.💪
私は、あなたには少なくとも全体としてDockerまたはContainerizationに関する若干の基本的な知識があると仮定します.しかし、私はあなたの多くは初心者も管理すると思います.💪
プロジェクト構造
私を誤解しないでください、この構造は何千ものうちの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 .
コメント、フィードバックや質問に自由に✌️
良い一日を!
Reference
この問題について(Go , Dockerとgitlabの簡単な設定), 我々は、より多くの情報をここで見つけました https://dev.to/dmitrijt9/go-docker-and-gitlab-easy-config-20beテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol