programing

도커화된 몽고의 데이터 초기화

closeapi 2023. 7. 10. 22:23
반응형

도커화된 몽고의 데이터 초기화

저는 도커화된 몽고 컨테이너를 운영하고 있습니다.

초기화된 데이터로 몽고 이미지를 만들고 싶습니다.

아이디어 있어요?

보다 독립적인 접근 방식:

  • 데이터베이스를 초기화하는 Javascript 파일을 만듭니다.
  • 이러한 파일이 포함된 파생 MongoDB 도커 이미지 생성

일회용 용기를 사용하거나 볼륨을 만들어 연결하는 답변이 많지만 이는 지나치게 복잡해 보입니다.몽고 도커 이미지의 docker-entrypoint.sh 을 보면 206행이 실행되는 것을 볼 수 있습니다./docker-entrypoint-initdb.d/*.js: 구을사용초기는파일하:mongo <db> <js-file>시드 데이터가 포함된 파생 MongoDB 도커 이미지를 생성하면 다음 작업을 수행할 수 있습니다.

  • 시드 데이터와 함께 몽고를 설정하는 단일 도커 실행 명령이 있습니다.
  • 컨테이너 정지 및 시작을 통해 데이터가 지속되도록 합니다.
  • 도커 중지, rm 및 실행 명령을 사용하여 해당 데이터 재설정
  • k8s, mesos, swarm, rancher와 같은 런타임 스케줄러로 쉽게 배포

이러한 접근 방식은 특히 다음과 같은 경우에 적합합니다.

  • 디스플레이를 위해 현실적인 데이터가 필요한 POC
  • 블랙박스 테스트를 위해 일관된 데이터가 필요한 CI/CD 파이프라인
  • 제품 데모(판매 엔지니어, 제품 소유자)를 위한 배포 예제

방법:

  1. 초기화 스크립트 생성 및 테스트(필요에 따라 데이터 그루밍)
  2. init 스크립트를 복사하는 파생 이미지에 대한 도커 파일 생성

    FROM mongo:3.4
    COPY seed-data.js /docker-entrypoint-initdb.d/
    
  3. 도커 이미지 구축

    docker build -t mongo-sample-data:3.4 .
    
  4. 선택적으로 다른 사용자가 사용할 수 있도록 이미지를 도커 레지스트리에 밀어넣습니다.

  5. 도커 이미지 실행

    docker run                               \
        --name mongo-sample-data             \
        -p 27017:27017                       \
        --restart=always                     \
        -e MONGO_INITDB_DATABASE=application \
        -d mongo-sample-data:3.4
    

기본적으로 도커 진입점입니다.그녀는 당신의 스크립트를 적용할 것입니다.test db; 위의실 명령행 ar▁env명 envarMONGO_INITDB_DATABASE=application합니다.application대db. 또는.또는 js 파일에서 다른 dbs를 생성하고 전환할 수 있습니다.

이 작업을 수행하는 Github repo가 있습니다. 여기 관련 파일이 있습니다.

몽고 도커의 최근 출시와 함께, 이것과 같은 것이 나에게 효과가 있습니다.

FROM mongo
COPY dump /home/dump
COPY mongo_restore.sh /docker-entrypoint-initdb.d/

몽고 복원 스크립트는 다음과 같습니다.

#!/bin/bash
# Restore from dump
mongorestore --drop --gzip --db "<RESTORE_DB_NAME>" /home/dump

정상적으로 이미지를 구축할 수 있습니다.

docker build -t <TAG> .

먼저 도커 볼륨 생성

docker volume create --name mongostore

그런 다음 몽고 컨테이너를 만듭니다.

docker run -d --name mongo -v mongostore:/data/db mongo:latest

-v합니다.mongostore/data/db입니다.mongo 데이저장위하치는입다니를터가,▁location다위니치입.볼륨이 호스트에서 영구적입니다. 중인 가 없는 이 mongostore로 됩니다.

docker volume ls

컨테이너를 종료하고 새 컨테이너를 생성할 수 있습니다(위와 동일한 라인). 그러면 새 mongo 컨테이너가 이전 컨테이너의 상태를 선택합니다.

볼륨 Mongo를 초기화하면 새 데이터베이스가 없는 경우 초기화됩니다.이 작업은 mongostore에서 초기 데이터를 생성하는 작업을 담당합니다.예를 들어 사전 시드된 데이터베이스를 사용하여 완전히 새로운 환경을 생성하려고 합니다.문제는 mongo 컨테이너를 만들기 전에 로컬 환경에서 볼륨으로 데이터를 전송하는 방법입니다.두 가지 사례를 열거하겠습니다.

  1. 로컬 환경

    Mac/Windows용 도커 또는 도커 도구 상자를 사용하고 있습니다.이 경우 로컬 드라이브를 임시 컨테이너에 쉽게 마운트하여 볼륨을 초기화할 수 있습니다.예:

    docker run --rm -v /Users/myname/work/mongodb:/incoming \
      -v mongostore:/data alpine:3.4 cp -rp /incoming/* /data
    

    이것은 클라우드 스토리지에서는 작동하지 않습니다.이 경우 파일을 복사해야 합니다.

  2. 원격 환경(AWS, GCP, Azure 등)

    업로드 속도를 높이기 위해 태그를 지정하거나 압축하는 것이 좋습니다.

    tar czf mongodata.tar.gz /Users/myname/work/mongodb
    

    그런 다음 파일을 압축 해제할 임시 컨테이너를 만들고 파일을 mongostore에 복사합니다.tail -f /dev/null용기가 빠져나가지 않도록 확인하는 것뿐입니다.

    docker run -d --name temp -v mongostore:/data alpine:3.4 tail -f /dev/null
    

    파일을 복사합니다.

    docker cp mongodata.tar.gz temp:.
    

    분리하고 볼륨으로 이동합니다.

    docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
    

    정리하다

    docker rm temp
    

원격 호스트에 파일을 복사하고 거기서 마운트할 수도 있지만 원격 호스트와 상호 작용하는 것을 전혀 피하는 경향이 있습니다.

부인.저는 이것을 메모리에서 쓰고 있습니다(테스트 없음).

도커 컴포지션을 사용한 방법은 다음과 같습니다.하는데, 는나몽고오이사를만용지하미지래된의,만▁i▁of▁the▁an지o사하▁but,docker-entrypoint.sh에서는 이미지의 모든 버전에 대해 *.js 및 *.sh 파일을 허용합니다.

도커식의

version: '3'

services:
  mongo:
    container_name: mongo
    image: mongo:3.2.12
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db:cached
      - ./deploy/local/mongo_fixtures /fixtures
      - ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh

volumes:
  mongo-data:
    driver: local

mongo_import.sh:

#!/bin/bash
# Import from fixtures

mongoimport --db wcm-local --collection clients --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json

은 monogo_fixes 의 제품입니다.monogoexport형식은 다음과 같습니다.

{"_id":"some_id","field":"value"}
{"_id":"another_id","field":"value"}

이것은 사용자 정의 Docke 파일 없이 도커 합성 파일의 올바른 진입점 설정으로 이미지를 바로 사용하는 사용자에게 도움이 될 것입니다.건배!

저는 제게 좀 더 쉬운 방법을 찾았습니다.

서버의 도커 컨테이너에 데이터베이스가 있는데 백업을 하려고 하면 다음과 같이 할 수 있습니다.

의 설정이 수 의 몽고 컨테이너의 입니다.mongodb ()elastic_spence을 잊지 마세요.--name mongodb다음 단계와 일치시킵니다.

$ docker run \
 --rm \
 --link mongodb:mongo \
 -v /root:/backup \
 mongo \
 bash -c ‘mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR’

그리고 덤프에서 데이터베이스를 복원합니다.

$ docker run \
 --rm \
 --link mongodb:mongo \
 -v /root:/backup \
 mongo \
 bash -c ‘mongorestore /backup --host $MONGO_PORT_27017_TCP_ADDR’

서버에 덤프를 다운로드해야 하는 경우 scp를 사용할 수 있습니다.

$ scp -r root@IP:/root/backup ./backup

또는 업로드:

$ scp -r ./backup root@IP:/root/backup

추신: 팀 브랜딘의 원본 출처는 https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62 에서 확인할 수 있습니다.

감사해요!

언급URL : https://stackoverflow.com/questions/39348478/initialize-data-on-dockerized-mongo

반응형