다중 FROM-의미


112

Neo4j 데이터베이스와 Node.js를 모두 실행해야하는 github 의 Linkurious 프로젝트에 대한 도커 이미지를 빌드하고 싶습니다 .

내 첫 번째 접근 방식은 Neo4j를 포함하는 내 이미지의 기본 이미지를 선언하는 것이 었습니다. 참조 문서는 유용한 방식으로 "기본 이미지"를 정의하지 않습니다.

기본 이미지 : 상위가없는 이미지는 기본 이미지입니다.

그 이미지 자체에 기본 이미지가없는 경우 기본 이미지 만있을 수 있음을 읽었습니다.

그러나 기본 이미지는 무엇입니까? FROM 지시문에서 neo4j / neo4j를 선언하면 이미지가 실행될 때 neo 데이터베이스가 자동으로 실행되고 포트 7474의 컨테이너 내에서 사용할 수 있다는 의미입니까?

Docker 참조 읽기 ( https://docs.docker.com/reference/builder/#from 참조 ) 다음을 참조하십시오.

FROM은 여러 이미지를 만들기 위해 단일 Dockerfile 내에서 여러 번 나타날 수 있습니다. 각각의 새로운 FROM 명령 이전에 커밋에 의해 출력 된 마지막 이미지 ID를 기록해 두십시오.

여러 이미지를 만들고 싶습니까? 내가 원하는 것은 neo4j 및 node.js와 같은 다른 이미지의 내용을 포함하는 단일 이미지를 갖는 것입니다.

참조 매뉴얼에서 종속성을 선언하는 지시문을 찾지 못했습니다. 내 이미지를 실행하기 위해 호출 컨텍스트가 먼저 필요한 이미지를 설치해야하는 RPM과 같은 종속성이 없습니까?

헷갈리네요 ...


참고 : 2017년 5월, 당신은 지금 여러가 FROMA의 Dockerfile. 아래에서 수정 된 답변을 참조하십시오.
VonC

내 대답이 더 깨끗한 지 확인하십시오. 만약 그렇다면 그것을 받아들이는 것을 고려하십시오.
Evan Carroll

답변:


113

기본 이미지 란 무엇입니까?

파일 세트, EXPOSE'd 포트 ENTRYPOINTCMD. 지시문
으로 새로 Dockerfile시작하여 파일을 추가하고 해당 기본 이미지를 기반으로 새 이미지를 빌드 할 수 있습니다 FROM. 다음에 언급 된 이미지 FROM는 새 이미지의 "기본 이미지"입니다.

지시문 neo4j/neo4j에서 선언 FROM하면 이미지가 실행될 때 neo 데이터베이스가 자동으로 실행되고 포트 7474의 컨테이너 내에서 사용할 수 있다는 의미입니까?

덮어 쓰지 않는 경우에만 CMDENTRYPOINT.
그러나 이미지 자체만으로도 충분 합니다. 특정 용도로 FROM neo4j/neo4j관련된 파일을 추가해야하는 경우 .neo4jneo4j

FROM 단일 Dockerfile 내에서 여러 번 나타날 수 있습니다.

하지마: 어쨌든 해당 "기능"을 제거하라는 제안이 있음 ( 문제 13026 )

문제 14412에 언급 된 내용 :

다중을 사용하는 FROM것은 실제로 기능이 아니지만 버그입니다 (오, 제한이 엄격하고 FROMDockerfile에서 다중 사용 사례가 거의 없습니다).


2017 년 5 월 (18 개월 후) 업데이트, docker (moby) 17.05-ce .

단일 Dockerfile에서 여러 FROM을 사용할 수 있습니다.
" Builder 패턴 vs. Docker의 다단계 빌드 "( Alex Ellis 작성 ) 및 Tõnis Tiigi의 PR 31257참조하십시오 .

전에:

빌더 패턴에는 두 개의 Docker 이미지 사용이 포함됩니다. 하나는 빌드를 수행하고 다른 하나는 첫 번째 이미지의 빌드 체인 및 도구의 패널티없이 첫 번째 빌드의 결과를 제공합니다.

후:

일반 구문에는 FROMDockerfile 내에 추가 시간을 추가하는 것이 포함됩니다 FROM.이 중 마지막 문이 최종 기본 이미지입니다. 중간 이미지에서 아티팩트와 출력을 복사하려면 COPY --from=<base_image_number>.

Dockerfile의 첫 부분 :

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

동일한 (!) Dockerfile 의 두 번째 부분 :

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app    .
CMD ["./app"]  

결과는 두 개의 이미지, 하나는 빌드 용이고 하나는 결과 앱만 포함됩니다 (훨씬 작음).

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

multi               latest              bcbbf69a9b59        6 minutes ago       10.3MB  
golang              1.7.3               ef15416724f6        4 months ago        672MB  

2
여러 발신자를 제거하는 것이 유감입니다. 특히 종속성 메커니즘이 없을 때 가장 유용합니다. 예를 들어, RPM을 사용하면 내 패키지를 실행하려면 다른 패키지가 필요하다고 선언 할 수 있으므로 설치시 모든 것이 설정됩니다. 현실은 대부분의 모든 것이 여러 종속성을 필요로 할 것이므로 여러 FROM이없는 경우 어떻게 작동해야합니까?
ekkis

3
이전 답변 ( stackoverflow.com/a/33295292/6309 ) 에서 언급했듯이 @ekkis , 각 컨테이너가 특정 서비스를 제공하고 --link ( docs.docker.com/)를 통해 통신하는 여러 컨테이너를 오케스트레이션하여 시스템을 실행합니다. userguide / dockerlinks /… ).
VonC 2015 년

2
@VonC 물론, 새로운 앱과 모든 패턴을 이해하는 이상적인 세상에서. 그동안 솔루션을 도커로 마이그레이션하려는 사람들이 더 많고 소프트웨어 종속성과 같은 네트워킹으로 해결되지 않는 요구 사항이 모두 호환되는 기반을 사용하지만 여러 Dockerfile에서 필요합니다. 대신 지금까지 알아낼 수있는 최선의 방법은 Dockerfile을 해킹하여 나만의 파일을 만드는 것입니다.
rainabba 18:39에

@rainabba 동의합니다. 레거시 모놀리스는 쉽게 마이그레이션되지 않습니다. 흥미로운 기사 : martinfowler.com/articles/… , threedots.tech/post/microservices-or-monolith-its-detail , hackernoon.com/…
VonC

2

첫 번째 대답은 너무 복잡하고 역사적이며 내 취향에 맞지 않습니다.


실제로는 다소 간단합니다. Docker는 다단계 빌드 라는 기능을 제공합니다. 여기서 기본 아이디어는 다음과 같습니다.

  • 원하는 것을 화이트리스트로 지정하여 원하지 않는 것을 수동으로 제거하지 않아도됩니다.
  • Docker의 구현으로 인해 사용되는 무료 리소스입니다.

첫 번째부터 시작하겠습니다. 데비안과 같은 것을 자주 보게 될 것입니다.

RUN apt-get update \ 
  && apt-get dist-upgrade \
  && apt-get install <whatever> \
  && apt-get clean

위의 관점에서이 모든 것을 설명 할 수 있습니다. 위의 명령은 서로 연결되어 있으므로 중간 이미지가 필요하지 않은 단일 변경을 나타냅니다. 이렇게 쓰여졌다면

RUN apt-get update ;
RUN apt-get dist-upgrade;
RUN apt-get install <whatever>;
RUN apt-get clean;

3 개의 임시 중간 이미지가 더 생성됩니다. 하나의 이미지로 축소하면 남은 문제가 하나 apt-get clean있습니다. 설치에 사용 된 아티팩트를 정리하지 않습니다. 데비안 관리자가 시스템을 수정하는 스크립트를 설치에 포함 시키면 수정 사항은 최종 솔루션에도 포함될 것 pepperflashplugin-nonfree입니다.

다단계 빌드를 사용하면 단일 변경 작업의 모든 이점을 얻을 수 있지만 COPY --from여기에 설명 된 구문을 사용하여 임시 이미지에 도입 된 파일을 수동으로 허용 목록에 추가하고 복사해야합니다 . 또한 대안 (예 :)이없고 apt-get clean그렇지 않으면 최종 이미지에 불필요한 파일이 많이 있는 훌륭한 솔루션 입니다.

또한보십시오


감사합니다.하지만 제 문제를 어떻게 해결 하시는지 모르겠습니다. 나에게 FROM은 상속 메커니즘이며 여러 지시문이 있다는 것은 여러 부모로부터 상속받을 수 있음을 의미합니다. 귀하의 답변에서 FROM 또는 다른 사람이 소프트웨어 패키징을 이용하는 개념에 대해 언급하지 않습니다.
ekkis

1
아마도 그것은 혼란 일 것입니다. FROM주로 네임 스페이스 선언입니다. 한정자는 상속보다 확장에 가깝습니다. 여러 네임 스페이스를 선언 할 수 있습니다. 그리고 각 네임 스페이스는 다른 네임 스페이스를 확장 할 수 있습니다. @ekkis 다른 답변이 효과가 있다면 반드시 그것에 충실하십시오.
Evan Carroll
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.