도커 이미지 진입점을 위한 스크립팅 언어로서의 Vlang

이 짧은 블로그 게시물에서는 V 언어(https://vlang.io/)를 스크립팅 언어로 사용하여 도커 구성의 진입점을 구성하는 방법을 설명합니다.

V언어란?



V 언어는 유지 관리 가능한 프로그램을 구축하기 위한 간단한 언어이며 Go lang 언어와 유사한 구문을 사용하지만 가변성 및 제네릭과 같은 추가 기능이 있는 사용자 친화적인 언어입니다.

또한 v 표준 라이브러리에는 새로운 시대에 태어나 bash와 같은 원래 쉘 언어가 완전히 지저분한 사람들을 위해 편안하게 쉘 스크립트를 작성하는 몇 가지 방법이 포함되어 있습니다.

Docker 이미지 진입점



도커 이미지의 일반적인 용도는 환경을 격리하고 애플리케이션을 위한 재현 가능한 환경을 만드는 것입니다.

그러나 컨테이너와 명령을 공유하고 컨테이너의 결과를 사용자에게 직접 반환하기 위해 docker 데몬과의 상호 작용이 필요한 명령줄 응용 프로그램과 같은 응용 프로그램이 있습니다.

이러한 유형의 작업은 일반적으로 컨테이너가 호출될 때마다 도커의 셸 스크립트 실행기에 의해 수행됩니다. 그러나 명령줄 응용 프로그램이 Bitcoin Core 또는 Core Lightning과 같이 복잡한 경우 bash 스크립트는 매우 복잡해지기 시작하고 도커 이미지에서 스크립트를 실행해야 하는 작업 유형을 확인하기 위해 문자열 간의 동등성을 확인하는 이상한 명령으로 가득 차게 됩니다.

또한 docker의 영구적인 상태를 관리하면 bash 스크립트가 관리할 수 없게 됩니다. 이 복잡한 유즈 케이스를 docker 이미지로 해결해야 하는 bash 친화적이지 않은 사람으로서 저는 V 언어를 스크립트 언어로 사용하기로 결정했습니다. 내 문제를 해결하는 아주 멋진 스크립트를 작성하십시오.

실제로 도커 이미지에 설치된 v 컴파일러는 매우 작고 일반적으로 외부 종속성이 필요하지 않으므로 영향이 매우 적고 os 명령을 실행하는 API는 매우 사용자 친화적입니다.

다음 링크에서 사용할 수 있는 도커 이미지를 빌드하고 이 경우에 사용된 패턴은 다음 코드와 같은 간단한entrypoint.sh 파일을 빌드하는 것이었습니다.

#!/bin/sh
set -e
v run /opt/conf_env.vsh "$@"


여기서 conf_env.vsh는 다음 코드와 같습니다.

// V script to manage the envoirment lightning env
//
// author: https://github.com/vincenzopalazzo
import os

fn run_tor() {
    if os.exists('/home/clightning4j/.tor') {
        os.execute_or_panic('rm -r /home/clightning4j/.tor')
    }
    println(os.execute_or_panic('tor --runasdaemon 1').output)
    curl_res := os.execute_or_panic('curl --socks5 localhost:9050 --socks5-hostname localhost:9050 -s https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs')
    println(curl_res.output)
    os.execute_or_panic('chown -R clightning4j /home/clightning4j/.tor')
}

fn build_ln_directory() string {
    ln_dir := os.environ()['CLIGHTNING_DATA']
    if !os.exists(ln_dir) {
        os.mkdir(ln_dir) or { panic('dir at path $ln_dir not created') }
        os.execute_or_panic('cp /opt/config $ln_dir/config')
        os.execute_or_panic('mkdir $ln_dir/plugins')
        os.execute_or_panic('cp /opt/*.sh $ln_dir/plugins/')
        os.execute_or_panic('chown -R clightning4j $ln_dir')
    }
    run_tor()
    return ln_dir
}

mut args_str := ''
for idx in 1 .. os.args.len {
    arg := os.args[idx]
    args_str += arg + ' '
}

if args_str.contains('lightning-cli') || !args_str.contains('--') {
    println(os.execute_or_panic(args_str).output)
} else {
    ln_dir := build_ln_directory()
    os.execute_or_panic('lightningd --lightning-dir=$ln_dir $args_str')
}


마무리 생각



다른 유형의 사용 사례에서 V 언어를 시도하는 경우 정보를 공유해 주세요. 언어를 어떻게 사용하고 있는지 알게 되어 매우 기쁩니다.

특정 질문이 있는 경우 의견을 남기고 Githubhttps://github.com/vincenzopalazzo에서 저를 팔로우하세요.

좋은 웹페이지 즐겨찾기