GN⁺: Show HN: #!/usr/bin/env docker run
(gist.github.com/adtac)#!
이란 무엇인가?
-
#!
(shebang이라고 발음함)은 유닉스에서 주로 파이썬이나 배시 같은 스크립팅 언어를 위해 사용되는 관례 - 이를 이용하여 크로스플랫폼 및 여러 리눅스 배포본에 애플리케이션을 배포하는 방식을 단일 파일로 패키징하는 데에 사용한 사례 소개
- 예제 Dockerfile은 백엔드, 데이터베이스, UI를 모두 포함하는 전체 스택 서버를 단일 파일로 구성함
- Cosmopolitan Libc와 비슷하지만 애플리케이션 패키징을 위한 것임
왜 사용하는가?
- 왜 안 사용하겠는가?
안전한가?
- 아마도 아닐 것임.
사용해야 하나?
- 원한다면 사용할 수 있음.
성능이 좋은가?
- 가능성이 있음.
유지보수가 가능한가?
- 아니오.
작동하는가?
- 예.
어떻게 실행하는가?
- 다음 명령어를 통해 실행 가능:
chmod +x ./Dockerfile ./Dockerfile
- 그 후 http://127.0.0.1:8080 주소로 접속.
GN⁺의 의견
- 이 기사는
#!
(shebang)을 이용하여 단일 Dockerfile로 전체 스택 서버를 패키징하는 독특한 방법을 소개함. - 기술적 호기심을 자극하고, 전통적인 애플리케이션 배포 방식에 대한 새로운 접근을 제시함.
- 이 방식은 유지보수와 안정성 측면에서는 권장되지 않지만, 실험적이고 혁신적인 프로젝트에 관심이 있는 개발자들에게 흥미로운 대안이 될 수 있음.
<<EOF같은 heredoc을 쓰려면 Dockerfile 상단에 # syntax = docker/dockerfile:1.4.0 가 필요합니다. 놀랍게도 syntax도 docker registry에서 받아옵니다.
와.. 이거 참신하네요. 마치 철근과 콘크리트의 조합을 발견한..건 좀 오바이긴 하지만 좋습니다.
#! 쉬뱅이 때마침 Dockerfile에서는 #주석문자인 바람에 이런식의 꼼수가 먹힌다니..
앞으론 build-run-test.sh
따위의 별도 파일 대신 Dockerfile에 넣어야겠네요.
이거 재미나네요. ㅎㅎㅎ "왜 사용하지 말아야 하지?"
Hacker News 의견
-
nix-shell shebang 사용 예시
-
nix-shell
shebang을 사용하여, 필요한 모든 의존성을 포함한 실행 가능한 스크립트를 만드는 방법을 설명함. - 이미지를 50% 축소하는 파이썬 스크립트 예시 제공.
- 스크립트에 실행 권한을 부여하면(
chmod +x
), 지정된 의존성을 가진 실행 파일이 됨.
-
-
/usr/bin/env
의-S
/--split-string
옵션- GNU Coreutils 8.30부터 사용 가능한
-S
옵션에 대한 설명. - 이 옵션은 표준이 아닌 동작에 의존하며, 모든 텍스트를 실행 파일의 인수로 처리하는 OS에서만 작동함.
- 대부분의 현대 GNU/Linux, BSDs, macOS에서는 이 비표준 동작이 작동함.
- GNU Coreutils 8.30부터 사용 가능한
-
Docker와 아키텍처 호환성
- Docker가 실제로는 리눅스 외의 다른 플랫폼에서는 리눅스 VM이 필요하다고 지적함.
- 리눅스 컨테이너는 훌륭하지만, Docker를 진정한 크로스 플랫폼 솔루션으로 보기는 어려움.
-
단일 파일 애플리케이션에 대한 의견
- 단일 파일로 전체 애플리케이션을 포함하는 아이디어에 대한 찬사.
- Docker의 복잡성에 대한 비판과, 보안이나 버전 관리를 위해 컨테이너를 사용하는 것에 대한 의문 제기.
- WebAssembly(WASM)가 이러한 문제를 해결할 수 있는지에 대한 질문.
-
Docker 대안으로 Podman과 bubblewrap 언급
- Docker 대신 Podman이나 bubblewrap을 사용하는 것이 더 나을 수 있음을 언급.
- Podman은 특정 배포판에 좀 더 의존적이고, bubblewrap은 일부 배포판에서 보안 문제로 포함되지 않을 수 있음.
-
heredocs를 사용한 단일 파일 프로젝트
- clever shebang 없이도 heredocs를 사용하여 어떤 언어나 인프라에 대한 단일 파일 프로젝트를 만들 수 있음.
- bash 스크립트로 패키징된 동일한 앱의 예시를 제공.
-
"단일 파일"에 대한 집착에 대한 비판
- 모든 것을 하나의 파일로 패키징하는 대신, 디렉토리를 사용하여 자체 포함된 애플리케이션을 만들 수 있음을 지적.
- 단일 파일로 만드는 것이 반드시 더 나은 방법은 아님을 언급.
-
자가 소비 스크립트 패턴
- 스크립트 내부에 다른 인터프리터 스크립트를 포함하고, sed를 사용하여 태그 사이의 스크립트를 추출하는 방법을 설명.
- 이러한 방법이 때때로 매우 유용할 수 있지만, 복잡해질 수 있음을 인정.
-
guix shell
을 shebang 위치에서 사용하는 방법- Guix 매뉴얼에서 가져온
guix shell
을 사용한 예시를 제공. - 보다 복잡한 환경을 지정하는 매니페스트 파일과 함께 작동함.
- Guix 매뉴얼에서 가져온
-
자체 빌드 및 실행되는 Dockerfile
- 2021년 11월에 작성된 자체 빌드 및 실행되는 Dockerfile에 대한 설명과 예시 코드 제공.