realize+docker에서 Golang 핫 리셋이 있는 개발 환경 구축

이번에 우리는 gin+gqlgen+gorm의 Go 프로젝트의 핫 리셋 개발 환경을 구축할 것이다.

컨디션

  • Go 1.12.6
  • 프로젝트 구조


    .
    ├── db
    │   └── db.go
    ├── models
    │   ├── model_a.go
    │   └── ...
    ├── schema
    │   ├── schema.graphql
    │   └── ...
    ├── server
    │   └── server.go
    ├── docker-compose.yml
    ├── go.mod
    ├── go.sum
    ├── gqlgen.yml
    └── ...
    

    사용할 핫 리셋 도구


    realize 도구를 사용합니다.
    그 외에 fresh 등 열중장 도구도 있는데 realize의 설정이 더 상세하기 때문에 realize를 선택했다.
    사실 처음에는 fresh에서 시도했지만 Go Modules 모드에 대응할 수 없을 것 같습니다.realize에서 적절한 설정을 통해 대응할 수 있다.

    Docker file 및 docker compose.yml의 준비


    상기 내용에 따라 열중량을 준비한Dockerfiledocker-compose.yml.
    FROM golang:1.12.6-alpine
    WORKDIR /app
    
    RUN apk add --no-cache alpine-sdk git && go get -u github.com/oxequa/realize
    
    EXPOSE 8080
    CMD ["realize", "start"]
    
    docker-compose.yml에서 개발 환경의 디렉터리를 용기에 부속시키는 설정을 진행한다.
    따라서 원본을 복제하지 않고 WORKDIR와 필요한 패키지만 설치합니다.
    version: '3'
    services:
      db:
        image: mysql:5.7
        ports:
          - "3306"
        restart: always
        command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
        environment:
          MYSQL_DATABASE: sample
          MYSQL_ROOT_PASSWORD: password
        volumes:
          - mysql-data:/var/lib/mysql
    
      application:
        build: .
        environment:
          MYSQL_DATABASE: sample
          MYSQL_HOST: db
          MYSQL_PASSWORD: password
          MYSQL_PORT: 3306
          MYSQL_USER: root
        depends_on:
          - db
        ports:
          - "8095:8080"
        restart: always
        volumes:
          - .:/app
    
    volumes:
      mysql-data:
        driver: local
    
    다음 부분에서 개발 환경의 디렉터리를 용기에 부속시키는 위치를 선택합니다.DockerfileWORKDIR와 같은 위치를 설정했는지 확인합니다.
        volumes:
          - .:/app
    

    realize 설정

    DockerfileCMD에서 realize start를 실행하지만 이 명령은 단일 항목으로 프로그램을 시작하지 않습니다.
    우선 손 옆에서 집행realize start.
    $ go get -u github.com/oxequa/realize
    # $GOPATH/binにPATHを通っていることを確認した後
    $ realize start
    
    시 생성.realize.yml된 설정 파일입니다.
    적절한 go 파일을 수정하고 저장하면, 이 내용이 로그로 출력되는지 확인하고, Ctrl + C를 통해 실행을 끝냅니다.
    settings:
      legacy:
        force: false
        interval: 0s
    schema:
    - name: sample
      path: .
      commands: {}
      watcher:
        extensions:
        - go
        paths:
        - /
        ignore:
          paths:
          - .git
          - .realize
          - vendor
    
    응용 프로그램realize start --run을 시작하려면 이렇게 매개 변수--run를 주거나 수정.realize.yml하면 다음과 같다.
    -  commands: {}
    +  commands:
    +    run:
    +      status: true
    
    일반적으로 이 상태realize start에서 프로그램이 시작되지만 Go Modules 모드에서는 오류가 발생하여 시작하지 않습니다.
    또한, 이번main 함수에 정의된 파일은main.go이 아니라server/server.go라는 점도 특이하다.
    이것을 흡수하는 데 사용할 설정을 추가합니다.
    commands:
    + install:
    +   status: true
    +   method: go build -o app.out ./server/server.go
      run:
        status: true
    +   method: ./app.out
    
    이렇게 하면 열중량이 유효한 상태에서 응용 프로그램이 시작됩니다.
    수중에 집행realize start하여 그 행위를 확인한다.realize 기본 재건축 프로젝트$GOPATH/bin에서 go install로 재건축합니다.Go Modules 모드에 존재하지 않기 때문$GOPATHgo install에 실패했다.
    이런 상황을 피하기 위해 go install이 아닌 사용go build -o app.out ./server/server.go으로 설정하고 가동 시 이 성과를 이용하여 가동한다.

    docker-compose로 시작


    여기까지 할 수 있다면 이후docker-compose에만 작동할 것이다.
    docker-compose build
    docker-compose up -d
    

    참고 자료

  • https://github.com/oxequa/realize/issues/217
  • 좋은 웹페이지 즐겨찾기