2 개의 실행 가능 바이너리가 들어있는 최소 도커 이미지 (FROM scratch
)를 만들려고합니다. 둘 다 Go로 빌드 된 바이너리입니다. 진입 점은 첫 번째 진입 점으로 설정됩니다. 이미지의 일부 데이터를 가져 와서 환경 변수를 사용하여 변환하고, 두 번째 이진을 실행하는 새 프로세스를 시작하고 생성 된 프로세스의 입력으로 데이터를 파이프합니다.이미지가 처음부터 빌드 된 도커 컨테이너에 새 프로세스를 만듭니다.
FROM scratch
COPY bin /opt/my-app
ENTRYPOINT ["/opt/my-app/first", "--run", "/opt/my-app/second"]
이 이미지를 Mac에서 만들면 모든 것이 잘됩니다. 하지만 리눅스를 실행하는 서버를 만들 때 첫 번째 프로세스가 두 번째 프로세스를 시작할 수 없습니다. "fork/exec/opt/my-app/second : no such file or directory"오류로 실패합니다. 그러나 "두 번째"바이너리가 존재합니다. 두 경우 모두 docker 엔진 1.13.1이 사용됩니다.
부모 이미지가 scratch
에서 debian:jessie
으로 변경된 경우에도 적용됩니다.
알지 못하는 스크래치 이미지에는 제한 사항이 있습니까?
바이너리가 정적으로 링크되어 있습니까? 스크래치 이미지를 사용하면 libc (또는 공유 라이브러리)가 없을 것입니다. 데비안에서 정상적으로 작동하면 바이너리가 정적으로 링크되지 않은 것으로 의심됩니다. 이는 정상적인 기본값입니다. CGO_ENABLED = 0 시도해보십시오. -a -installsuffix cgo 여기에 보이는대로 http://www.blang.io/posts/2015-04_golang-alpine-build-golang-binaries-for-alpine-linux/ – foo
힌트를 보내 주셔서 감사합니다. CGO_ENABLED = 0으로 설정하면 도움이됩니다. 답변으로 게시하면 기꺼이 받아 들일 수 있습니다. :) –