taskfile.dev에서 docker-compose와 같은 인수가 너무 많아 문제를 한꺼번에 간단하게 만듭니다.

TLDR


  • golang으로 작성된 작업 주자
  • Taskfile.yml에서 작업 정의
  • task dev 라든지 task bash 라고 하는 느낌으로 호출
  • task cp_from --- target.file 같은 느낌으로 인수도 건네줄 수 있다
  • 각 작업에서 다른 작업을 호출 할 수도 있습니다.
  • docker-compose -f...task dev

    소개



    여러분 오늘도 docker를 사용하고 있습니까?
    인수가 너무 많아 손가락이 붙지 않습니까?
    나는 이 건이 계속 신경이 쓰이고 있어, 어떻게 하면 해결할 수 있을까를 기억하고는 여러가지 조사하고 있었습니다.

    php라면 composer.json에 쓰는가?
    js라면 package.json에 쓰는가?
    아니면 grunt 또는 gulp??
    아니, 그건 아니야.
    docker에 관련된 조작을 정리하고 싶으니까 다르네요.

    어떤 PaaS의 서포트씨는, Makefile라든지에 쓰면, 라든지 제안해 주었습니다만, 의존관계도 없고, 이제 한층 Makefile인가라고 생각해 이 건 잠시 선반 올리고 있었습니다. 그렇게 하면 어제 문득 찾아낸 이 프로젝트.

    그 외 sk피. 에서 v





    그 외 sk피. 에서 v

    설치



    Mac이라면 Homebrew로 설치 가능합니다.
    brew install go-task/tap/go-task
    

    그 외 각 패키지 매니저(Snap, Scoop, Aur)에도 대응.

    작업 정의 및 호출


    # Taskfile.yml
    version: '3'
    
    hello:
      cmds:
        - echo 'hello world' 
    

    여기서 hello가 작업 이름입니다. cmds에서 런타임에 호출되는 명령을 정의합니다.
    명령줄에서 task タスク名로 작업을 호출합니다.
    ❯ task hello
    
    task: [hello] echo 'hello world'
    hello world
    

    변수, 환경 변수, 인수, .env 등



    자세한 내용은 Usage에 작성되었지만 , 대체로 모두가 하고 싶은 것 같은 것을 소개해 둡니다.

    변수



    자체적으로 변수를 정의할 수 있습니다. vars: 로 정의합니다. 앞에 쓰고 전역으로 정의하거나 각 작업 로컬 변수를 정의 할 수 있습니다. 스타일 가이드에는 대문자 뱀 케이스가 권장됩니다.
    변수 참조시에는 {{ .VAR_NAME }} 라고 씁니다.
    vars:
      MY_NAME: 'foo'
    
    tasks:
      hello_global:
        cmds:
          - echo 'hello world' {{ .MY_NAME }}
    
      hello_local:
        vars:
          MY_NAME: 'foobar'
        cmds:
          - echo 'hello world' {{ .MY_NAME }}
    
    
    ❯ task hello_global
    
    task: [hello] echo 'hello world' foo
    hello world foo
    

    로컬 변수는 전역 변수를 덮어 쓰지만 특별히 경고하지 않는 것 같습니다.
    ❯ task hello_local
    
    task: [hello] echo 'hello world' foobar
    hello world foobar
    

    환경 변수



    환경 변수는 {{ .ENVVAR_NAME }} 로 호출할 수 있습니다.
    환경 변수는 전역 vars로 덮어쓸 수 있지만,
    vars:
      SHELL: "sheeeeel"
    
    tasks:
      hello_env:
        cmds:
          - echo 'hello' {{ .SHELL }}
    
    ❯ task hello_env
    
    task: [hello_dotenv] echo 'hello' sheeeeel
    hello sheeeeel
    

    로컬 vars에서는 덮어쓸 수 없습니다.
    tasks:
      hello_env:
        vars:
          SHELL: "sheeeeel"
        cmds:
          - echo 'hello' {{ .SHELL }}
    
    ❯ task hello_env
    
    task: [hello_dotenv] echo 'hello' /bin/bash
    hello /bin/bash
    

    인수



    task 명령 호출시의 인수는 {{ .CLI_ARGS }} 로 참조.
    tasks:
      hello_args:
        cmds:
          - echo 'hello' {{ .CLI_ARGS }}
    

    호출시에는 --를 붙여 호출 커멘드명과 구별합니다.
    ❯ task hello_args -- string from args
    
    task: [hello_args] echo 'hello' string from args
    hello string from args
    

    .env



    .env 파일은 dotenv 지시자로 읽기를 지정합니다.
    # .env
    DOTVAR='value from .env'
    
    dotenv: ['.env']
    
    tasks:
      hello_dotenv:
        cmds:
          - echo 'hello' {{ .DOTVAR }}
    
    ❯ task hello_dotenv
    
    task: [hello_dotenv] echo 'hello world' value from .env
    hello value from .env
    

    실제 사용 예



    나는 복잡해지는 docker-compose의 호출을 정의하고 간략하게 해 보았습니다.
    
    version: '3'
    
    vars:
      BASE_CMD: 'docker-compose'
      DEV_COMPOSE_FILE: 'docker-compose-develop.yml'
      APP_CONTAINER: 'app'
      APP_CONTAINER_IMAGE: 'myproject_app_1'
    
    tasks:
      dev:
        cmds:
          - "{{ .BASE_CMD }} -f {{ .DEV_COMPOSE_FILE }} up"
    
      bash:
        cmds:
          - "{{ .BASE_CMD }} -f {{ .DEV_COMPOSE_FILE }} exec {{ .APP_CONTAINER }} bash"
    
      cp_from:
        cmds:
          - CONTAINER_ID=$(docker ps| grep {{ .APP_CONTAINER_IMAGE }} | awk '{ print $1 }'); docker cp $CONTAINER_ID:/var/www/html/{{ .CLI_ARGS}} .
    
      cp_to:
        cmds:
          - CONTAINER_ID=$(docker ps| grep {{ .APP_CONTAINER_IMAGE }} | awk '{ print $1 }'); docker cp {{ .CLI_ARGS}} $CONTAINER_ID:/var/www/html/
    

    그 외, 여러가지 사용도를 생각해 내면 또 추기해 가려고 생각합니다.
  • 좋은 웹페이지 즐겨찾기