distroless docker 이미지에서 두 개의 nodejs 모듈을 실행하는 방법

4062 단어 dockerdistrolessnode
최근에 alpine 도커 이미지를 Distroless로 교체하여 더 많은 benifits을 얻으려고 했습니다. 그러나 사용 가능한 쉘이 없다는 오류를 만났습니다.dockerfileCMD은 다음과 같습니다.

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.jsserver.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.jsserver.js가 모두 필요할 때만 작동합니다. 내가 원하는 경우 server.jsdosomthing.js가 오류 없이 또는 오류로 끝나는 경우에만 시작됩니다. &&|| 연산자와 함께 명령 셸을 사용하여 쉽게 구현할 수 있습니다. 이 내용은 다음 포스트에서 다루겠습니다.

읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기