distroless docker 이미지에서 두 개의 nodejs 모듈을 실행하는 방법
alpine
도커 이미지를 Distroless
로 교체하여 더 많은 benifits을 얻으려고 했습니다. 그러나 사용 가능한 쉘이 없다는 오류를 만났습니다.dockerfile
의 CMD은 다음과 같습니다.CMD node dosomething.js & node server.js
이 형식(aka shell-form)에서는 명령(node dosomething.js 및 node server.js)을 실행하기 위해 명령 셸을 호출합니다.
If you use the shell form of the CMD, then the will execute in /bin/sh -c
Distroless
내부에 쉘이 없기 때문에 오류가 발생합니다."Distroless" images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.
나는
dosomething.js
의 코드를 server.js
로 옮기는 것이 너무 복잡하다는 생각에서 시작했습니다. 소스 코드에서 server.js가 생성되었고 무언가를 삽입하고 여전히 작동하기가 어렵 기 때문에 마침내 너무 복잡하다는 것을 알았습니다.그런 다음 러너가
dosomething.js
및 server.js
를 하위 프로세스로 시작하도록 하는 두 번째 아이디어에 도달했습니다. 코드는 다음과 같았습니다.runner.js
const { fork } = require('child_process')
const path = require('path')
fork(
path.resolve('dosomething.js'),
null,
{
detached: true
}
)
fork(
path.resolve('server.js'),
null,
{
detached: true,
}
)
포크는 첫 번째 인수로 정의된 모듈(첫 번째 인수, 예를 들어
path.resolve('server.js')
)에서 child process을 시작합니다.두 번째 인수는 server.js에 대한 인수 목록입니다.
server.js
가 동작을 제어하기 위해 인수를 수락하면 여기에 무언가를 추가할 수 있습니다. 이 샘플에는 추가 인수가 필요하지 않으므로 null로 만듭니다.마지막 인수는 옵션이며
detached:true
는 모듈(예: server.js)에서 시작된 하위 프로세스가 상위 프로세스와 독립적으로 실행됨을 나타냅니다. 그것은 다른 플랫폼에서 다른 동작을 하지만 간단히 말해서 메인 다이 여부에 관계없이 하위 프로세스가 계속 실행되도록 한다고 생각할 수 있습니다. 내 요구 사항에 맞게.마지막으로 docker 파일의 CMD는 다음과 같습니다.
CMD ["runner"]
따라서 위의 접근 방식으로 문제를 해결하십시오. 그러나
dosomthing.js
와 server.js
가 모두 필요할 때만 작동합니다. 내가 원하는 경우 server.js
는 dosomthing.js
가 오류 없이 또는 오류로 끝나는 경우에만 시작됩니다. &&
및 ||
연산자와 함께 명령 셸을 사용하여 쉽게 구현할 수 있습니다. 이 내용은 다음 포스트에서 다루겠습니다.읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(distroless docker 이미지에서 두 개의 nodejs 모듈을 실행하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wangpin34/run-two-nodejs-modules-in-distroless-docker-image-34ci텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)