2017-11-12 23 views
4

일 문제

작동하지 않습니다. 그러나 도커 컨테이너 내 응용 프로그램의 네트워크에있는 다른 컨테이너의 호스트 이름에 대한 도메인 이름 확인이 실패합니다 (단, wget/ping 다른 컨테이너 및 해당 호스트 이름을 올바르게 확인할 수 있음).하스켈 - 알파인 도커 이미지 내부 호스트 이름 확인이 나는 내부의 하스켈 응용 프로그램과 고정 표시기 이미지를 만들기 위해 노력하고

근본 원인을 찾으려면 호스트 이름 (Network.DNS 패키지 사용)을 수동으로 확인하고 servant-client의 IP 주소 만 사용하십시오. 그러나 이것은 단지 암호 같은 오류 메시지를 얻을 :

Network.BSD.getProtocolByName: does not exist (no such protocol name: udp)

내가 내 고정 표시기 이미지 내부의 패키지를 놓치고 생각합니다. libc6-compat을 설치하려했지만 성공하지 못했습니다 (Debian의 libc6은 하스켈 애플리케이션을 컴파일하는 데 사용되었습니다). 또한 /etc/protocols에는 올바른 항목이 들어 있습니다. 도커 이미지 안에 무엇이 빠져 있습니까? Whole dockerfile, there's not much in it - 나는 응용 프로그램을 실행하는 데 사용하고

도커 이미지

고정 표시기 이미지 alpine:3.6입니다. 이것은 응용 프로그램을 빌드하는 데 사용 된 것과 다른 이미지입니다 (약 20x 작음).

haskell 앱을 빌드하는 데 사용하는 고정 이미지는 debian:stretch을 기반으로합니다. Dockerfile. 빌드 지침에

전체 소스 코드 (각도 부분은 생략 할 수있다) 여기에 있습니다 : 당신이 실행되도록 하스켈 코드에 대한 몇 가지 링크 종속성을 누락처럼

https://github.com/carbolymer/blockchain/tree/0b041875f71b2a09dc8568ee7b0cc22460fd5624

+0

'strace'를 사용해 보셨습니까? – melpomene

+0

내부 도커 ('strace -p 1'을 루트로 실행) : strace : attach : ptrace (PTRACE_ATTACH, 1) : 조작이 허용되지 않음' – carbolymer

+0

haskell은 인터프리터없이 실행하는 바이너리를 빌드합니까? 즉 코드를 실행하기 위해 외부 바이너리가 필요한 자바, 루비 또는 노드와는 다릅니다. – Matt

답변

0

알파인 + musl libc에 GHC 8.2.1을 설치할 수 없습니다. 해결 방법은 이미지를 alpine-glibc 이미지를 사용하려고했지만 내 응용 프로그램이 호스트 이름을 확인하려고 할 때마다 segfaults가 발생했습니다. It turns out, that this is known bug in glibc.

해결 방법은 동적으로 연결된 바이너리 + alpine-glibc 이미지 + gmp-dev을 추가로 설치하는 것입니다.

1

그것은 소리.

알파인은 크기를 줄이기 위해 musl libc을 사용합니다. 따라서 대부분의 표준 링크 된 이진 파일은 GNU libc을 사용할 때 표준 배포본에서 실행되지 않습니다. alpine image에서 앱을 평소대로 컴파일하거나 statically linked binary to run in any Linux distro/container을 만듭니다.

기본 데비안 계층은이 이미지를 사용하는 모든 이미지간에 공유되므로 어떤 경우에도 생각만큼 많은 공간을 절약하지 못할 수도 있습니다. 데비안 이미지를 사용하는 것이 더 쉬워 진다면, 그것을 사용하십시오.

+0

예, 정적으로 링크 된 바이너리를 생성합니다. 빌드 명령은 https://github.com/carbolymer/docker-images/blob/master/haskell-stack/stack-build-static입니다.여기서 문제는 원래 'glibc'가 필요한 '네트워크'하스켈 패키지라고 가정합니다. 여기서 질문은, musl libc가 GNU libc와 호환 되는가? Btw. 연결된 문서가 구식이며 ghc-8.2.1에서 작동하지 않습니다. – carbolymer