본문 바로가기

settings/Others

Windows 컨테이너에 chocolatey 설치 삽질

이전 포스팅 ☛ Docker Windows 컨테이너 삽질 기록

 

먼길을 돌아 .net framework용 이미지를 다운로드하고, 컨테이너를 실행했을 때 문제없이 잘 돌아갔습니다. 하지만 윈도우용 패키지 관리자인 chocolatey를 설치한 후, 컨테이너를 재시동하면 강제 종료되는 문제가 발생했습니다.

 

chocolatey를 설치한 후, 컨테이너를 재시동했을 때 뱉어내는 에러

문제가 된 에러는 다음과 같았습니다.

Service 'w3svc' has been stopped

APPCMD failed with error code 183

 

도커를 처음 사용하다보니, 위 에러가 어디서 발생한 것인지를 찾는데만 한참 걸렸습니다. chocolatey를 설치했을 때, 위 에러가 발생한다는 것을 찾고 나서 생각한 해결방법은 다음과 같았습니다.

 

1. chocolatey를 사용하지 않고, powershell 명령어로 설치할 수 있는 posh-git을 사용한다.

2. chocolatey가 문제라면 다른 윈도우용 패키지 관리자를 설치해본다.

 

결과만 말씀드리자면 posh-git을 설치하는데는 실패했고, scoop이라는 다른 패키지 관리자도 설치했을 때 chocolatey와 동일한 에러를 내뿜으면서 강제 종료되는 현상이 발생되었습니다. 

 


scoop까지 실패하고 나서, 에러메시지와 관련된 github, stackoverflow의 글들을 일일이 번역하면서 자세히 들여다봤습니다. 그렇게 Restarting container fails라는 github issue를 발견할 수 있었습니다. 관련 기능을 개발하는 MS 개발자의 답변도 있었습니다. 제시한 해결책은 다음과 같았습니다. 

 

1. Dockerfile에 ADD 옵션을 추가

2. ServiceMonitor.exe를 Old Version의 파일로 replace

 

도커를 제대로 만져본게 처음이므로 Dockerfile이 생소했던 저에게 1번은 무리였습니다. 대신 Old Version의 ServiceMonitor.exe를 다운받아서, 변경하는 건 쉽겠다 싶어서 시도했습니다. 

// dotnetTest 생성, 바인딩
docker run -d -it -p 8000:80 --name dotnetTest mcr.microsoft.com/dotnet/framework/samples:aspnetapp 

위 명령어로 dotnetTest를 생성한 후에 CLI를 열어서 다음 명령어를 수행합니다.

// powershell 실행
Powershell

// chocolatey install
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

// go to root folder
Cd ..\..

// delete ServiceMonitor.exe
Rm ServiceMonitor.exe

여기까지 수행했다면, 컨테이너를 종료한 다음, Old Version의 ServiceMonitor.exe를 로컬에서 컨테이너로 복사를 해줍니다.

docker cp .\ServiceMonitor.exe dotnet:ServiceMonitor.exe

ServiceMonitor.exe를 변경한 후에는, w3svc로 강제 종료되던 문제가 해결되었습니다. 2019년부터 관련 이슈가 있었던 것 같은데, 아직까지 고쳐지지 않은 게 미스터리네요🤔

 


 

관련 에러를 해결한 docker image를 dockerhub에 올려놓았습니다.

dockerhub ☛ mskwon16/dotnet-chocolatey

docker pull mskwon16/dotnet-chocolatey

Microsoft사가 배포한 .NET framework 이미지에 chocolatey를 설치하고, chocolatey로 git까지 설치한 버전입니다.

 

dotnet-chocolatey 이미지

이미지를 실행하면 choco version과 git version 명령어가 잘 실행되는걸 확인하실 수 있을겁니다 :>


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다 :D