it-source

Docker compose에서 명령을 한 번 실행하는 방법

criticalcode 2023. 6. 20. 21:40
반응형

Docker compose에서 명령을 한 번 실행하는 방법

그래서 저는 바둑 웹 서버를 배포하기 위해 도커 작성 파일을 만들고 있습니다.나의 서버는 mongo를 사용하기 때문에 docker compose에 data volume container와 mongo service를 추가했습니다.그리고 나서 저는 바둑 프로젝트를 만들기 위해 도커 파일을 작성했고, 마침내 그것을 실행했습니다.

하지만, 해야 할 또 다른 단계가 있습니다.../my-project -setup

이렇게 하면 데이터베이스에 필요한 정보가 추가되며, 정보는 한 번만 추가하면 됩니다.그러나 mongo가 이미 시작되어 있어야 하기 때문에 Docker 파일에 이 단계를 추가할 수 없습니다.

그렇다면, 어떻게 하면 이것을 달성할 수 있을까요? 시작하고 해도 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅠdocker-compose up이 명령을 다시 실행하지 않습니다.

데이터 볼륨 컨테이너에 대한 모든 것을 실제로 이해하지 못하기 때문에 Docker에 대한 이해가 부족한 것 같습니다(볼륨을 탑재하는 중지된 컨테이너일 입니까?).또한 서버를 다시 시작한 다음docker-compose up어떤 명령이 실행됩니까?지정된 CMD로 중지된 것과 동일한 컨테이너를 시작합니까?

어쨌든 다음은 제 도커 컴포지.yml입니다.

version: '2'
services:
  mongodata:
    image: mongo:latest
    volumes:
      - /data/db
    command: --break-mongo
  mongo:
    image: mongo:latest
    volumes_from:
      - mongodata
    ports:
      - "28001:27017"
    command: --smallfiles --rest --auth
  my_project:
    build: .
    ports:
      - "6060:8080"
    depends_on:
      - mongo
      - mongodata
    links:
      - mongo

다음은 프로젝트 이미지를 빌드하기 위한 Docker 파일입니다.

FROM golang

ADD . /go/src/my_project
RUN cd /go/src/my_project && go get
RUN go install my_project
RUN my_project -setup
ENTRYPOINT /go/bin/my_project

EXPOSE 8080

컨테이너에 진입점 스크립트를 추가하는 것이 좋습니다. 이 진입점 스크립트에서는 데이터베이스가 초기화되었는지 확인하고, 초기화되지 않은 경우 필요한 단계를 수행할 수 있습니다.

질문에서 알 수 있듯이 서비스/컨테이너가 시작되는 순서를 당연하게 생각해서는 안 됩니다. 따라서 애플리케이션 컨테이너가 데이터베이스 컨테이너보다 먼저 시작될 수 있으므로 스크립트는 이를 고려해야 합니다.

예를 들어, 공식 WordPress 이미지는 데이터베이스의 진입점 스크립트에서 일회성 초기화를 수행합니다.이 스크립트는 데이터베이스 연결을 시도하고(아직 데이터베이스에 연결할 수 없는 경우 재시도) 초기화가 필요한지 확인합니다. https://github.com/docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171

메모

볼륨을 연결할 "데이터 전용 컨테이너"를 만들었습니다.도커 1.9 이후 도커는 볼륨 이름 지정을 포함한 볼륨 관리 기능을 제공합니다.따라서 더 이상 "데이터 전용" 컨테이너를 사용할 필요가 없습니다.

데이터 전용 컨테이너를 작성 파일에서 제거하고 mongo 서비스를 다음과 같이 변경할 수 있습니다.

  mongo:
    image: mongo:latest
    volumes:
      - mongodata:/data/db
    ports:
      - "28001:27017"
    command: --smallfiles --rest --auth

이이지새볼생성다라는 의 새 볼륨이 됩니다.mongodata볼륨이 존재하지 않는 경우 또는 해당 이름으로 기존 볼륨을 다시 사용합니다.다음을 사용하여 모든 볼륨을 나열할 수 있습니다.docker volume ls는 볼륨을 제거합니다.docker volume rm <some-volume>더 이상 그것이 필요하지 않다면

지침을 사용해 볼 수 있습니다.

ONBUILD명령은 이미지가 다른 빌드의 기본으로 사용될 때 나중에 실행될 트리거 명령을 이미지에 추가합니다.됩니다. 리거는빌컨실 처럼. 마치 바로 다음에 트리거가 삽입된 것입니다.FROM 하서교육의 Dockerfile.

모든 빌드 명령을 트리거로 등록할 수 있습니다.

이 기능은 애플리케이션 빌드 환경이나 사용자별 구성으로 사용자 지정할 수 있는 데몬과 같이 다른 이미지를 빌드하는 데 사용할 이미지를 빌드하는 경우에 유용합니다.

예를 들어 이미지가 재사용 가능한 Python 응용 프로그램 작성기인 경우 특정 디렉터리에 응용 프로그램 소스 코드를 추가해야 하며 이후에 빌드 스크립트를 호출해야 할 수도 있습니다.그냥 전화하면 안 돼요ADD그리고.RUN아직 응용프로그램 소스 코드에 액세스할 수 없으며 각 응용프로그램 빌드마다 다를 것이기 때문입니다. 프로그램 보일러 할 수 있습니다.Dockerfile응용프로그램에 복사할 수 있지만 응용프로그램별 코드와 혼합되므로 효율성이 떨어지고 오류가 발생하기 쉬우며 업데이트하기가 어렵습니다.

은 해책은다같습다니과를 사용하는 입니다.ONBUILD다음 빌드 단계에서 나중에 실행할 사전 지침을 등록합니다.

작동 방식은 다음과 같습니다.

  1. 그것이 마주쳤을 때.ONBUILD작성자는 빌드 중인 이미지의 메타데이터에 트리거를 추가합니다.이 명령은 현재 빌드에 영향을 주지 않습니다.
  2. 빌드가 끝나면 모든 트리거 목록이 이미지 매니페스트의 키 아래에 저장됩니다.OnBuild이를 통해 검사할 수 있습니다.docker inspect지휘권
  3. 나중에 이미지를 사용하여 새 빌드의 기본으로 사용할 수 있습니다.FROM설명. 처리로를 하는 과정의 .FROM지시, 다트림찾것는빌을 .ONBUILD등록된 순서대로 트리거하고 실행합니다. 중 실패할 , "트리거"는 다음과 같습니다.FROM명령이 중단되어 빌드가 실패합니다. 트리거가하면, 모트리성공면하가거든,FROM명령이 완료되고 빌드가 정상적으로 계속됩니다.
  4. 트리거는 실행된 후 최종 영상에서 지워집니다.다시 말해, 그들은 "손주" 건물에 의해 상속되지 않습니다.

도커 합성에서는 다음을 정의할 수 있습니다.

다시 시작: 아니요

컨테이너를 한 번만 실행합니다. 예를 들어 DB 마이그레이션 컨테이너에 유용합니다.

프로그램이 작동하려면 초기 상태가 필요합니다.즉, 다음을 수행해야 합니다.

  1. 필요한 상태가 이미 있는지 확인합니다.
  2. 첫 번째 단계 결과 init 상태에 따라 다름

현재 데이터베이스 상태를 확인하기 위한 프로그램을 작성할 수 있습니다(여기서는 bash 스크립트를 사용하겠지만 다른 모든 언어 프로그램일 수 있습니다).

RUN if $(./check.sh); then my_project -setup; fi

스크립트가종료 상태)을 반환할 , " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 이 됩니다.setup명령이 호출됩니다.

언급URL : https://stackoverflow.com/questions/36407477/how-to-run-a-command-once-in-docker-compose

반응형