도커 이미지를 하나의 컨테이너에 결합하는 방법이 있습니까?
지금 도커 파일이 몇 개 있습니다.
3이고, 은 하는카산라드를한 3.5위것이,고그은것나▁one입니다.FROM cassandra:3.5
저는 카프카를 위한 도커 파일도 가지고 있지만, 그것은 꽤 복잡합니다.그렇다.FROM java:openjdk-8-fre그리고 카프카와 주키퍼를 설치하는 긴 명령을 실행합니다.
마지막으로 스칼라로 작성된 SBT를 사용하는 애플리케이션이 있습니다.
파일의 해당도파의경우일커,경,우,FROM broadinstitute/scala-baseimage자바 8, 스칼라 2.11.7, STB 0.13.9가 필요합니다.
저는 작동하는지할 수 , 제을 위해 제 할 수 .Dockerfile그런 다음 카산드라, 카프카, 스칼라, 자바, SBT를 모두 내장하여 소스를 컴파일할 수 있습니다.하지만 저는 이것에 대해 많은 문제를 가지고 있습니다.
이 도커 파일을 어떻게 결합합니까?어떻게 하면 간단하게 그런 것들로 환경을 만들 수 있을까요?
도커 1.17에 도입된 다단계 빌드 기능을 사용하면 가능합니다.
이것을 확인해 보십시오.
FROM golang:1.7.3
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 .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
그런 다음 이미지를 정상적으로 빌드합니다.
docker build -t alexellis2/href-counter:latest
보낸 사람: https://docs.docker.com/develop/develop-images/multistage-build/
최종 결과는 이전과 동일한 작은 프로덕션 이미지로 복잡성이 크게 감소합니다.중간 이미지를 만들 필요도 없고 로컬 시스템에 아티팩트를 추출할 필요도 전혀 없습니다.
어떻게 작동합니까?두 번째 시작 명령은 alpine:latest 이미지를 기본으로 하여 새 빌드 단계를 시작합니다.복사 --from=0 라인은 이전 단계의 빌드된 아티팩트만 이 새 단계로 복사합니다.Go SDK 및 중간 아티팩트는 남아 최종 영상에 저장되지 않습니다.
충돌이 발생할 수 있으므로 도커 파일을 결합할 수 없습니다.새 도커 파일을 만들거나 사용자 정의 이미지를 만드는 것이 좋습니다.
TL;DR; 현재 개발 컨테이너에 필요한 모든 도구가 포함되어 있고 작동하는 경우 이미지로 저장하고 이미지에서 repo로 이동할 도커 파일을 생성합니다.
세부사항:사용자 지정 이미지를 작성하는 것이 공용 이미지를 사용하여 도커 파일을 작성하는 것보다 훨씬 쉽습니다. 모든 해킹 및 모드를 이미지에 저장할 수 있기 때문입니다.이렇게 하려면 기본 Linux 이미지(또는 광범위한 Institute/scala-base 이미지)를 사용하여 빈 컨테이너를 시작하고 필요한 모든 도구를 설치한 후 모든 것이 올바르게 작동할 때까지 구성한 다음 해당 컨테이너를 이미지로 저장합니다.이 이미지에서 새 컨테이너를 만들고 그 위에 도커 합성(또는 원하는 방식으로)을 통해 코드를 빌드할 수 있는지 테스트합니다.작업 기반 이미지가 있으면 다른 사용자가 작업 기반 이미지를 풀 수 있도록 저장소에 업로드할 수 있습니다.
공개 이미지로 도커 파일을 작성하려면 모든 해킹, 모드 및 설정을 도커 파일 자체에 넣어야 합니다.즉, 사용한 모든 명령줄을 텍스트 파일에 배치하고 모든 해킹, 모드 및 설정을 명령줄로 줄여야 합니다.마지막에 도커 파일이 이미지를 자동으로 생성하므로 이 이미지를 레포에 저장할 필요가 없으며 다른 사람에게 도커 파일을 제공하면 다른 사람이 자신의 도커에서 이미지를 회전시킬 수 있습니다.
작업 중인 도커 파일이 있으면 도커 파일을 사용할 때마다 새 이미지가 생성되므로 쉽게 수정할 수 있습니다.사용자 지정 이미지를 사용하는 경우 충돌로 인해 이미지를 재구성해야 하는 문제가 발생할 수 있습니다.예를 들어, 작동하지 않는 도구를 설치하기 전까지는 모든 도구가 openjdk와 함께 작동합니다.openjdk를 제거하고 오라클 버전을 사용해야 하지만 설치한 모든 도구에 대해 수행한 모든 구성이 손상되었습니다.
다음 답변은 도커 1.7 이상에 적용됩니다.
는 사하고싶다니습용을 사용하는 합니다.--from=NAME그리고.from image as NAME 요왜를 할 수 있다고요? 당신은 사용할 수 있습니다.--from=0도커 파일에 도커 단계가 많으면 관리하기가 거의 어려울 수 있습니다.
예제:
FROM golang:1.7.3 as backend
WORKDIR /backend
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN #install some stuff, compile assets....
FROM golang:1.7.3 as assets
WORKDIR /assets
RUN ./getassets.sh
FROM nodejs:latest as frontend
RUN npm install
WORKDIR /assets
COPY --from=assets /asets .
CMD ["./app"]
FROM alpine:latest as mergedassets
WORKDIR /root/
COPY --from=frontend . /
COPY --from=backend ./backend .
CMD ["./app"]
참고: 도커 파일을 제대로 관리하면 도커 이미지를 훨씬 빠르게 구축하는 데 도움이 됩니다.내부적으로 도커는 이미지를 재구성해야 하는 경우 이 프로세스를 지원하기 위해 도커 계층 캐싱을 사용합니다.
예, 전체 소프트웨어를 하나의 도커 이미지로 롤할 수 있습니다(GitLab은 Postgres와 다른 모든 것을 포함하는 하나의 이미지로 이 작업을 수행합니다). 하지만 일반적인 헨리의 말이 맞습니다. 도커를 사용하는 일반적인 방법은 아닙니다.
당신이 말했듯이, 카산드라와 카프카는 당신의 스칼라 앱의 종속성이며, 그것들은 앱의 일부가 아니기 때문에, 그것들은 모두 같은 이미지에 속하지 않습니다.
Docker Composite를 사용하여 많은 컨테이너를 조정해야 하는 경우 관리 계층이 추가되지만 훨씬 더 유연합니다.
- 컨테이너의 수명이 서로 다를 수 있으므로 배포할 새 버전의 앱이 있을 때는 새 앱 컨테이너만 실행하면 되므로 종속성은 계속 실행할 수 있습니다.
- 종속성에 대해 서로 다른 구성을 사용하여 모든 환경에서 동일한 앱 이미지를 사용할 수 있습니다. 예를 들어 dev에서는 기본 Kafka 컨테이너를 실행할 수 있고 여러 노드에서 클러스터링된 경우 앱 컨테이너가 동일합니다.
- 다른 앱에서도 종속성을 사용할 수 있으므로 여러 소비자가 서로 다른 컨테이너에서 실행할 수 있고 모든 소비자가 동일한 카프카 및 카산드라 컨테이너로 작업할 수 있습니다.
- 그리고 이미 언급한 모든 확장성, 로깅 등.
언제 도커 이미지를 "결합"하시겠습니까?
다른 사람들이 여기서 지적하는 것처럼, 일반적으로 데이터베이스와 응용프로그램을 동일한 도커 이미지에 배치하지 않습니다.이상적으로는 도커 이미지가 "단일 프로세스"/"런타임"을 래핑하기를 원합니다.이를 통해 각 프로세스를 개별적으로 스케일업/스케일다운하고 재시작할 수 있습니다.
사용 중인 이미지의 패키지 관리자에서 사용할 수 없는 일부 공유 C-라이브러리/실행 파일을 사용하려고 하지만 다른 사용자가 미리 컴파일된 이미지를 생성했다고 가정해 보겠습니다. 이러한 바이너리를 빌드의 일부로 다시 컴파일하지 않을 수도 있습니다(이 작업 시간에 따라 다름).기존 이미지를 기반으로 이러한 모든 실행 파일/라이브러리가 포함된 POC-Docker 이미지를 신속하게 생성할 수 있는 방법이 있습니까?
도커 및 구성
관련 토론: https://github.com/moby/moby/issues/3378
도커에는 이미지를 구성하는 좋은 방법이 없습니다.다음을 사용하여 다른 이미지의 개별 파일 또는 전체 파일 시스템을 자신의 이미지로 복사할 수 있습니다.COPY --from=<image> <from-path> <to-path>환경 변수를 다른 이미지에서 자신의 이미지로 복사하는 기본 제공 방식은 없습니다.
즉, 저는 개인적으로 Docker 파일을 위한 사용자 정의 프론트엔드/파서를 만들었습니다.INCLUDE <image>-어쨌든.이렇게 하면 전체 파일 시스템과 환경 변수가 이미지에 복사됩니다.
DOCKER_BUILDKIT=1 docker build -t myimage .
#syntax=bergkvist/includeimage
FROM alpine:3.12.0
INCLUDE rust:1.44-alpine3.12
INCLUDE python:3.8.3-alpine3.12
nixpkgs.dller도구들
정말 컴포지트 가능한 도커 빌드를 원한다면 도커를 확인해 보는 것을 추천합니다.도구는 nixpkgs입니다.이렇게 하면 더 재현 가능한(일반적으로 매우 작은) 영상이 생성됩니다.https://nix.dev/자습서/빌드 앤 런 도커 이미지 참조
docker load < $(nix-build docker-image.nix)
# docker-image.nix
let
pkgs = import <nixpkgs> {};
python = pkgs.python38;
rustc = pkgs.rustc;
in pkgs.dockerTools.buildImage {
name = "myimage";
tag = "latest";
contents = [ python rustc ];
}
도커는 이미지를 병합하지 않지만, 도커 파일이 있는 경우 도커 파일을 결합하여 빌드해야 하는 두꺼운 이미지로 롤링하는 것을 막을 수 있는 기능은 없습니다.그러나 컨테이너에서 여러 프로세스를 실행하는 것과 관련하여 대부분의 도커 독단은 특히 마이크로서비스 아키텍처에서 이를 바람직하지 않다고 지적할 때가 있습니다(그러나 규칙을 어길 필요가 있습니까?).
도커 이미지를 하나의 용기에 결합할 수 없습니다.자세한 내용은 Moby 문제, "Docker 파일을 통해 여러 이미지를 하나로 결합하는 방법"을 참조하십시오.
당신의 경우, 전체 카산드라와 카프카 이미지를 포함하지 않는 것이 좋습니다.애플리케이션에는 카산드라 스칼라 드라이버와 카프카 스칼라 드라이버만 필요합니다.컨테이너에는 드라이버만 포함되어야 합니다.
Gitlab CI를 위해 도커:latest 및 python:latest 이미지가 필요했습니다.제가 생각해 낸 것은 다음과 같습니다.
FROM ubuntu:latest
RUN apt update
RUN apt install -y sudo
RUN sudo apt install -y docker.io
RUN sudo apt install -y python3-pip
RUN sudo apt install -y python3
RUN docker --version
RUN pip3 --version
RUN python3 --version
Docker Hub repo를 빌드하고 푸시한 후:
docker build -t docker-hub-repo/image-name:latest path/to/Dockerfile
docker push docker-hub-repo/image-name:latest
잊지 마세요docker login
도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/39626579/is-there-a-way-to-combine-docker-images-into-1-container
'codememo' 카테고리의 다른 글
| onRequestPermissionsFragment와 작업 모두에 정의된 경우 fragment에서 호출되지 않는 결과 (0) | 2023.08.06 |
|---|---|
| Android가 프로세스를 죽이는 시뮬레이션 방법 (0) | 2023.08.06 |
| 스토리보드를 사용하지 않고 어떻게 새로운 Swift 프로젝트를 만들 수 있습니까? (0) | 2023.08.06 |
| Google 지도 Android API v2 - Interactive InfoWindow(원래 Android Google 지도와 동일) (0) | 2023.08.06 |
| AJAX Post를 통해 파일 판독기 이진 데이터로 파일 입력 게시 (0) | 2023.08.06 |