Docker

Alpine Linux를 Docker Host로 사용하기

Superkill 2018. 4. 16. 14:35
반응형

알파인 리눅스에 도커를 깔고나서

nginx를 도커 컨테이너로 올려봤고 잘 동작했다.


그런데!

node 도커 컨테이너로 올리려 했는데 자꾸 segfault 에러가 나서 컨테이너가

실행하자마자 바로 죽어버리는 현상에 맞닥뜨렸다. 

로그내용은 다음과 같다.

Apr 16 10:22:29 localhost kern.info kernel: [ 3660.266769] node[4245]: segfault at f ip 0000000000ff4830 sp 000074feff9fa3a0 error 6 in node[400000+1b9b000]

Apr 16 10:22:29 localhost kern.alert kernel: [ 3660.266780] grsec: Segmentation fault occurred at 000000000000000f in /usr/local/bin/node[node:4245] uid/euid:0/0 gid/egid:0/0, parent /usr/bin/docker-containerd-shim[docker-containe:

4228] uid/euid:0/0 gid/egid:0/0

Apr 16 10:22:29 localhost kern.alert kernel: [ 3660.266804] grsec: denied resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 for /usr/local/bin/node[node:4245] uid/euid:0/0 gid/egid:0/0, parent /usr/bin/docker-con

tainerd-shim[docker-containe:4228] uid/eui


노드 도커 이미지를 이것저것 바꿔가며 해봤지만 여전했다.
node를 직접 로컬에 설치해서 실행하는것도 잘 되는데  왜 이건 안될까?
열심히 뒤져봤지만 자료도 별로 없고 
(아마도 알파인 리눅스를 호스트로 잘 안쓰기 때문일 것)


위 링크처럼 나랑 같은 증상을 겪고 알파인리눅스에 대해 불만섞인 글도 보고

https://docs.docker.com/install/#server

도커 문서에서 알파인 리눅스를 지원한다는 단서를 찾을 수 없었어서

알파인리눅스에서 도커를 돌리는것을 포기하려하다가


아래의 글을 발견했다.

여기서 하는것 처럼 노드를 실행하기 전 아래의 두 줄을 실행시키면 해결이 되었다.
apk add --no-cache paxctl 

paxctl -cm `which node`

그 와중에 아래 메시지가 떳는데

file /usr/local/bin/node had a PT_GNU_STACK program header, converted

paxctl의 -c 옵션으로 인한 것이었다.

-c create the PT_PAX_FLAGS program header if it does not exist        by converting the PT_GNU_STACK program header if it exists

-m do not enforce secure memory protections (NOMPROTECT)


일단 해결 완료

pax란? grsec이란?


+추가)

위 방식대로 해결을 했다고 생각했었는데 아래와 같은 애러가 발생하기 시작했다.

Apr 17 17:10:51 localhost kern.err kernel: [114567.951624] ata1: exception Emask 0x50 SAct 0x0 SErr 0x4090800 action 0xe frozen

Apr 17 17:10:51 localhost kern.err kernel: [114567.951629] ata1: irq_stat 0x00400040, connection status changed

Apr 17 17:10:51 localhost kern.err kernel: [114567.951634] ata1: SError: { HostInt PHYRdyChg 10B8B DevExch }

Apr 17 17:10:51 localhost kern.info kernel: [114567.951647] ata1: hard resetting link

Apr 17 17:10:52 localhost kern.info kernel: [114568.990563] ata1: SATA link down (SStatus 0 SControl 300)

Apr 17 17:10:57 localhost kern.info kernel: [114574.074158] ata1: hard resetting link

Apr 17 17:10:57 localhost kern.info kernel: [114574.388215] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)

Apr 17 17:10:57 localhost kern.info kernel: [114574.393844] ata1.00: configured for UDMA/133

Apr 17 17:10:57 localhost kern.info kernel: [114574.393853] ata1: EH complete


또한 도커를 처음 설치해서 동작시킨 이후부터
도커 로그에서는 다음과 같은 워닝 메시지가 생성되어 왔었고
Your kernel does not support swap memory limit

failed to retrieve docker-runc version: unknown output format: runc version spec: 1.0.0\n

could not use snapshotter btrfs in metadata plugin" error="path /var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.btrfs must be a btrfs filesystem to be used with the btrfs snapshotter" module="containerd/io.containerd.metadata.v1.bolt

(Unable to complete atomic operation, key modified)

하드웨어 문제일 수도 있지만 어쩌면 도커 문제일 수도 있지 않을까 해서 도커를 삭제하고 에러 메시지 출력을 지켜보기로 했다.



5월 4일

도커를 삭제했지만 여전히 로그에 emask exception 발생.. 

바이오스 업데이트와 사타 케이블 교체를 할 예정이다.


5월 7일

아직 바이오스 업데이트와 사타케이블 교체를 하지 않았는데

도커를 삭제 한지 하루정도 뒤부터 3일동안 로그에 에러가 안찍힌다..


5월 8일

가 아니라 여전히 emask 에러 발생함 오늘 케이블 교체해야겠다


5월 17일

케이블 교체해도 여전히 에러발생 링크

It's Kernel Bug on ata ACPI. I put "options libata noacpi=1" on /etc/modprobe.d/options and the ERROR is gone. 

여기서 말하는대로 일단 해놓아보았다.