programing

도커 컴포지트 후 스크립트 실행 방법

muds 2023. 10. 18. 23:06
반응형

도커 컴포지트 후 스크립트 실행 방법

도커(-compose)를 사용하여 개발 프로세스를 더 쉽게 유지 관리할 수 있도록 노력하고 있습니다.볼륨을 사용하고 싶지 않습니다(가능하다면).docker-compose up-d'를 실행한 후 import.sh 이 실행되지 않는 이유는 무엇입니까?

다음 파일을 가지고 있습니다.

docker-compose.yml
  mysql
  ---- import.sh
  ---- db.sql
  ---- Dockerfile

도커- compose.yml에는 다음이 있습니다.

version: '2'

services:
  database:
    image: mysql
    build:
      context: ./mysql/
      dockerfile: Dockerfile
    container_name: mysqltest
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456

/mysql/Docker 파일에는 다음이 있습니다.

ADD import.sh /tmp/import.sh
ADD db.sql /tmp/db.sql
RUN /tmp/import.sh

/mysql/db.sql에는 다음이 있습니다.

CREATE DATABASE test1;
CREATE DATABASE test2;
CREATE DATABASE test3;

사용가능ENTRYPOINT아니면CMD컨테이너가 시작될 때 명령을 실행하기 위해 Docker 파일에 저장합니다.그들의 차이점은ENTRYPOINT컨테이너가 시작될 때마다 실행됩니다.CMD명령 줄 옵션으로 대체될 수도 있습니다.실행하고자 하는 명령어가X

docker run my-image Y

실행할 것입니다X한다면ENTRYPOINT X도커 파일에 있었고,Y한다면CMD X도커 파일에 있었어요

그러나 두 가지 주의 사항이 있습니다.

  1. 이 명령은 컨테이너가 시작될 때마다 실행됩니다.
  2. 명령이 종료되면 컨테이너가 종료됩니다.

따라서 일반적인 해결책은docker-entrypoint대본.환경을 시작하는 새 컨테이너에서 실행되는지 확인한 후 컨테이너의 실제 프로그램을 실행합니다.아이디어를 얻기 위해서 공식적인 mysql Docker 파일과 엔트리 포인트를 보세요.

엔트리 포인트 스크립트의 예는 다음과 같습니다.

$ cat docker_entrypoint.sh                                                                                                                                          
if [ ! -f .initialized ]; then                                                                                                                                                                                    
    echo "Initializing container"                                                                                                                                                                                 
    # run initializing commands                                                                                                                                                                                   
    touch .initialized                                                                                                                                                                                            
fi                                                                                                                                                                                                                

exec "$@"

먼저, 라는 파일이 있는지 확인합니다..initialized 일부 없으면 일부 명령을 실행하여 컨테이너 환경을 초기화합니다. 이후로touch .initialized성을 ..initialized빈 파일로서 후속 컨테이너 시작은 다시 실행하지 않습니다.따라서 이후의 컨테이너 시작은 초기화 명령을 다시 실행하지 않습니다.두 번째로 실제 서비스를 시작합니다.이거랑 같이 하는 거랑.exec셸 프로세스를 서비스 프로세스로 대체합니다.따라서 도커는 서비스가 종료될 때까지 컨테이너를 계속 가동할 것입니다."$@"에는 "container/image 명령"이 포함됩니다.이 세트는 다음과 같습니다.CMD X위에서 이미 지적했듯이, Docker 파일에서 명령어를 덮어씁니다.사용함으로써exec "$@"검사를 위해 컨테이너에 있는 다른 프로그램을 시작할 수 있습니다.bash, 그리고 도커 파일에 명시된 대로 기본적으로 서비스를 시작합니다.CMD진술.

처음부터 db를 초기화하고 싶다면 이렇게 쉬운 방법을 사용하면 됩니다.

    volumes:
      - [the scripts dir]:/docker-entrypoint-initdb.d

새 인스턴스 초기화 컨테이너를 처음 시작할 때 지정된 이름의 새 데이터베이스가 생성되고 제공된 구성 변수로 초기화됩니다.또한 /docker-entrypoint-initdb.d에 있는 확장자 .sh, .sql 및 .sql.gz 파일을 실행합니다.파일은 알파벳순으로 실행됩니다.SQL 덤프를 해당 디렉토리에 마운트하고 기여된 데이터와 함께 사용자 지정 이미지를 제공하여 mysql 서비스를 쉽게 채울 수 있습니다.SQL 파일은 기본적으로 MYSQL_DATABASE 변수에 의해 지정된 데이터베이스로 가져옵니다.

의사 선생님 오셨습니다: https://docs.docker.com/samples/library/mysql/

언급URL : https://stackoverflow.com/questions/42117362/how-to-execute-scripts-after-docker-compose-up

반응형