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과 같은 종속성이 없습니까?
헷갈리네요 …
답변
기본 이미지 란 무엇입니까?
파일 세트, EXPOSE
‘d 포트 ENTRYPOINT
및 CMD
. 지시문
으로 새로 Dockerfile
시작하여 파일을 추가하고 해당 기본 이미지를 기반으로 새 이미지를 빌드 할 수 있습니다 FROM
. 다음에 언급 된 이미지 FROM
는 새 이미지의 “기본 이미지”입니다.
지시문
neo4j/neo4j
에서 선언FROM
하면 이미지가 실행될 때 neo 데이터베이스가 자동으로 실행되고 포트 7474의 컨테이너 내에서 사용할 수 있다는 의미입니까?
덮어 쓰지 않는 경우에만 CMD
및 ENTRYPOINT
.
그러나 이미지 자체만으로도 충분 합니다. 특정 용도로 FROM neo4j/neo4j
관련된 파일을 추가해야하는 경우 .neo4j
neo4j
FROM
단일 Dockerfile 내에서 여러 번 나타날 수 있습니다.
하지마: 어쨌든 해당 “기능”을 제거하라는 제안이 있음 ( 문제 13026 )
문제 14412에 언급 된 내용 :
다중을 사용하는
FROM
것은 실제로 기능이 아니지만 버그입니다 (오, 제한이 엄격하고FROM
Dockerfile에서 다중 사용 사례가 거의 없습니다).
2017 년 5 월 (18 개월 후) 업데이트, docker (moby) 17.05-ce .
단일 Dockerfile에서 여러 FROM을 사용할 수 있습니다.
” Builder 패턴 vs. Docker의 다단계 빌드 “( Alex Ellis 작성 ) 및 Tõnis Tiigi의 PR 31257 을 참조하십시오 .
전에:
빌더 패턴에는 두 개의 Docker 이미지 사용이 포함됩니다. 하나는 빌드를 수행하고 다른 하나는 첫 번째 이미지의 빌드 체인 및 도구의 패널티없이 첫 번째 빌드의 결과를 제공합니다.
후:
일반 구문에는
FROM
Dockerfile 내에 추가 시간을 추가하는 것이 포함됩니다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
답변
첫 번째 대답은 너무 복잡하고 역사적이며 내 취향에 맞지 않습니다.
실제로는 다소 간단합니다. 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
그렇지 않으면 최종 이미지에 불필요한 파일이 많이 있는 훌륭한 솔루션 입니다.
또한보십시오