# Show HN: #!/usr/bin/env docker run

> Clean Markdown view of GeekNews topic #12858. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12858](https://news.hada.io/topic?id=12858)
- GeekNews Markdown: [https://news.hada.io/topic/12858.md](https://news.hada.io/topic/12858.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-01-15T09:51:40+09:00
- Updated: 2024-01-15T09:51:40+09:00
- Original source: [gist.github.com/adtac](https://gist.github.com/adtac/595b5823ef73b329167b815757bbce9f)
- Points: 15
- Comments: 7

## Topic Body

### `#!`이란 무엇인가?  
- `#!` (shebang이라고 발음함)은 유닉스에서 주로 파이썬이나 배시 같은 스크립팅 언어를 위해 사용되는 관례  
- 이를 이용하여 크로스플랫폼 및 여러 리눅스 배포본에 애플리케이션을 배포하는 방식을 단일 파일로 패키징하는 데에 사용한 사례 소개   
- 예제 Dockerfile은 백엔드, 데이터베이스, UI를 모두 포함하는 전체 스택 서버를 단일 파일로 구성함  
- Cosmopolitan Libc와 비슷하지만 애플리케이션 패키징을 위한 것임  
  
### 왜 사용하는가?  
- 왜 안 사용하겠는가?  
  
### 안전한가?  
- 아마도 아닐 것임.  
  
### 사용해야 하나?  
- 원한다면 사용할 수 있음.  
  
### 성능이 좋은가?  
- 가능성이 있음.  
  
### 유지보수가 가능한가?  
- 아니오.  
  
### 작동하는가?  
- 예.  
  
### 어떻게 실행하는가?  
- 다음 명령어를 통해 실행 가능: `chmod +x ./Dockerfile  ./Dockerfile`  
- 그 후 http://127.0.0.1:8080 주소로 접속.  
  
##### GN⁺의 의견  
- 이 기사는 `#!` (shebang)을 이용하여 단일 Dockerfile로 전체 스택 서버를 패키징하는 독특한 방법을 소개함.  
- 기술적 호기심을 자극하고, 전통적인 애플리케이션 배포 방식에 대한 새로운 접근을 제시함.  
- 이 방식은 유지보수와 안정성 측면에서는 권장되지 않지만, 실험적이고 혁신적인 프로젝트에 관심이 있는 개발자들에게 흥미로운 대안이 될 수 있음.

## Comments



### Comment 22327

- Author: minhoryang
- Created: 2024-01-17T15:58:59+09:00
- Points: 1

<<EOF같은 heredoc을 쓰려면 Dockerfile 상단에 # syntax = docker/dockerfile:1.4.0 가 필요합니다. 놀랍게도 syntax도 docker registry에서 받아옵니다.

### Comment 22305

- Author: pmc7777
- Created: 2024-01-16T21:56:55+09:00
- Points: 1

와... 올해 최대 정신적 충격입니다ㅋㅋㅋㅋㅋㅋㅋㅋㅌ

### Comment 22271

- Author: arfwene
- Created: 2024-01-15T15:42:13+09:00
- Points: 1

재밌는 방법이네요

### Comment 22267

- Author: bbulbum
- Created: 2024-01-15T12:01:02+09:00
- Points: 1

ㅋㅋㅋ.. 참신하네요 진짜

### Comment 22262

- Author: sagee
- Created: 2024-01-15T11:09:03+09:00
- Points: 1

와.. 이거 참신하네요. 마치 철근과 콘크리트의 조합을 발견한..건 좀 오바이긴 하지만 좋습니다.   
#! 쉬뱅이 때마침 Dockerfile에서는 #주석문자인 바람에 이런식의 꼼수가 먹힌다니..   
앞으론 `build-run-test.sh` 따위의 별도 파일 대신 Dockerfile에 넣어야겠네요.

### Comment 22250

- Author: xguru
- Created: 2024-01-15T10:00:34+09:00
- Points: 1

이거 재미나네요. ㅎㅎㅎ "왜 사용하지 말아야 하지?"  
  
- [Cosmopolitan libc - Build-Once Run-Anywhere C](https://news.hada.io/topic?id=3489)  
- [Cosmopolitan v1.0 공개](https://news.hada.io/topic?id=4278)  
- [Cosmopolitan v2.0 릴리즈](https://news.hada.io/topic?id=7235)  
- [Cosmopolitan v3.0 - "Build Once Anywhere, Run Anywhere C/C++"](https://news.hada.io/topic?id=11639)

### Comment 22245

- Author: neo
- Created: 2024-01-15T09:51:40+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38987109) 
- 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에서는 이 비표준 동작이 작동함.

- 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`을 사용한 예시를 제공.
  - 보다 복잡한 환경을 지정하는 매니페스트 파일과 함께 작동함.

- 자체 빌드 및 실행되는 Dockerfile
  - 2021년 11월에 작성된 자체 빌드 및 실행되는 Dockerfile에 대한 설명과 예시 코드 제공.
