컨테이너 시작 시 프로세스 시작
개발 컨테이너에서 작업할 때 컨테이너가 시작될 때마다 명령을 실행하거나 무언가를 시작하고 싶을 수 있습니다. 이를 수행하는 가장 쉬운 방법은 devcontainer.json의 postStartCommand 속성을 사용하는 것입니다. 예를 들어, 종속성을 최신 상태로 유지하기 위해 컨테이너에 연결할 때마다 yarn install을 실행하고 싶다면 다음과 같이 추가할 수 있습니다.
"postStartCommand": "yarn install"
동영상: 컨테이너 생성 시 npm install 실행
다른 경우에는 프로세스를 시작하여 실행 상태로 유지하고 싶을 수 있습니다. 이는 nohup을 사용하고 &를 사용하여 프로세스를 백그라운드로 보내서 달성할 수 있습니다. 예를 들어,
"postStartCommand": "nohup bash -c 'your-command-here &'"
동영상: 컨테이너가 시작될 때마다 'npm start' 실행
Linux에 익숙한 사람이라면 systemctl 명령을 사용하여 systemd라는 시스템에서 관리하는 백그라운드 서비스를 시작하고 중지할 수 있을 것으로 예상할 수 있습니다. 안타깝게도 systemd는 오버헤드가 있어 일반적으로 컨테이너에서는 사용되지 않습니다.
많은 경우 대신 실행할 수 있는 명령(예: sshd)이 있습니다. 그리고 Debian/Ubuntu에서는 종종 /etc/init.d 아래에 직접 실행할 수 있는 스크립트가 있습니다.
"postStartCommand": "/etc/init.d/ssh start"
이러한 시스템에는 설치된 내용에 따라 systemctl 또는 /etc/init.d 스크립트를 사용하는 service 명령도 포함됩니다.
"postStartCommand": "service ssh start"
동영상: 컨테이너에서 SSH 서비스 시작
대신 Docker 이미지에 시작 명령 추가
postStartCommand는 편리하고 소스 트리에서 명령을 실행할 수 있지만, 대신 사용자 지정 ENTRYPOINT 또는 CMD를 사용하여 Dockerfile에 이러한 단계를 추가할 수도 있습니다.
devcontainer.json에서 Dockerfile을 참조할 때 기본 진입점 및 명령이 재정의됩니다. 먼저 overrideCommand 속성을 사용하여 이 동작을 비활성화합니다.
"overrideCommand": false
overrideCommand 속성은 기본적으로 true입니다. 많은 이미지가 명령이 지정되지 않으면 즉시 종료되기 때문입니다. 대신 Dockerfile에서 이 문제를 처리해야 합니다.
다음으로 이 Dockerfile을 고려해 보세요.
FROM mcr.microsoft.com/devcontainers/base:1-ubuntu
COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT [ "/docker-entrypoint.sh" ]
CMD [ "sleep", "infinity" ]
여기서 CMD는 컨테이너가 기본적으로 실행 상태를 유지하도록 합니다. 시작 단계를 ENTRYPOINT에 유지하면 이미지와 함께 docker run을 사용하거나 Docker Compose를 사용할 때 명령을 안전하게 재정의할 수 있습니다. 이는 다음과 같이 해결됩니다.
/docker-entrypoint.sh sleep infinity
다음으로 docker-entrypoint.sh 스크립트를 만듭니다.
#!/usr/bin/env bash
echo "Hello from our entrypoint!"
exec "$@"
이 파일에서 실행하는 모든 것은 컨테이너가 시작될 때마다 트리거됩니다. 그러나 마지막 exec "$@" 줄을 포함하는 것이 중요합니다. 이것이 예제에서 sleep infinity 명령을 트리거하는 것이기 때문입니다.
마지막으로 Docker Compose를 사용하는 경우 컨테이너에 대해 entrypoint 또는 command 속성이 설정되지 않았는지 확인하십시오.