programing

도커 - compose, 컨테이너가 시작된 후에 스크립트 실행?

cafebook 2023. 10. 25. 23:43
반응형

도커 - compose, 컨테이너가 시작된 후에 스크립트 실행?

저는 랜처를 통해 도커 컴포지트를 통해 키우고 있는 서비스가 있습니다.컨테이너가 전개된 후 비밀번호를 설정해야 하는 문제가 있습니다.

목장 주인의 비밀이 작동하는 방법은, 제가 비밀을 설정하면 목장 주인이 제 비밀이 담긴 파일을 제 컨테이너에 탑재하는 것입니다.나는 그 비밀을 잡기 위해 스크립트를 실행하고 내 구성 파일에 비밀번호를 설정할 수 있기를 희망했습니다.

저는 그 비밀을 도커 파일을 통해 가져올 방법이 없다고 생각합니다. 왜냐하면 저는 그 비밀이 도커 파일에 포함되는 것을 원하지 않기 때문입니다. 그래서 저는 도커 작곡을 통해 그것을 수행하는 것을 고려하고 있습니다.

이게 가능한지 아는 사람?

진입점을 덮어쓰지 않고 컨테이너를 시작한 후 스크립트를 호출하는 방법입니다.

예를 들어, 로컬 몽고DB의 복제 세트를 초기화하는 데 사용했습니다.

services:
  mongo:
    image: mongo:4.2.8
    hostname: mongo
    container_name: mongodb
    entrypoint: ["/usr/bin/mongod","--bind_ip_all","--replSet","rs0"]
    ports:
      - 27017:27017
  mongosetup:
    image: mongo:4.2.8
    depends_on:
      - mongo
    restart: "no"
    entrypoint: [ "bash", "-c", "sleep 10 && mongo --host mongo:27017 --eval 'rs.initiate()'"]      
  • 1부는 간단하게 서비스를 시작합니다(몽고)
  • 두 번째 서비스는 "bash" 진입 지점과restart: no<=중요

저도 a를 사용합니다.depends_on서비스와 셋업 서비스 사이에서 시작 주문을 관리할 수 있습니다.

방법은 원래 명령을 호출하기 전에 필요한 모든 초기화 작업을 수행하기 위해 compose COMMAND를 덮어쓰는 것입니다.

  1. 설정된 암호, 내부 구성 파일 변경 등 원하는 init 작업을 수행할 스크립트를 이미지에 추가합니다.그럼 이만.init.sh. 이미지에 추가합니다.

도커 파일:

FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
ENTRYPOINT []

위의 내용은 ENTERPOINT가 정의된 내용을 재정의합니다.sourceimage. 그것은 이 예를 더 간단하게 만들기 위한 것입니다.INTERPOINT가 도커 파일에서 수행하는 작업을 이해했는지 확인합니다.sourceimage전화해 보세요command:도커- compose.yml 파일의.

도커- compose.yml:

services:
  myservice:
    image: something:tag
    ...
    command: sh -c "/usr/local/bin/init.sh && exec myexecutable"

사용하는 것이 중요합니다.exec주 명령을 내리기 전에 말입니다그러면 STOP, KILL(키보드의 Ctrl-C) 또는 HUP와 같은 신호를 수신할 수 있는 첫 번째 프로세스(PID1)로 명령이 설치됩니다.

볼륨을 사용하여 다음 작업을 수행할 수도 있습니다.

services:
  example:
    image: <whatever>
    volume: ./init.sh:/init.sh
    entrypoint: sh -c "/init.sh"

이것은 탑재될 것입니다.init.sh복사하지 않고 컨테이너에 저장합니다(중요한 경우에는 일반적으로 그렇지 않습니다).기본적으로 컨테이너 내의 프로세스를 수정할 수 있습니다.init.sh실제 컴퓨터에 존재하는 파일을 수정할 수 있습니다.

도커 - compose는 실행 중인 기존 컨테이너를 수정하는 방법이 아니라 컨테이너를 시작하는 방법을 지정합니다.

Rancher 문서는 비밀의 기본적인 사용을 위해, 당신은 비밀 배열의 이름으로 비밀을 참조할 수 있다고 언급합니다.docker-compose.yml.

대상 파일 이름은 암호 이름과 같습니다.
기본적으로 대상 파일 이름은 사용자 ID 및 그룹 ID 0, 파일 모드 0444로 생성됩니다.
비밀 부분에서 외부를 true로 설정하면 비밀이 이미 생성되었음을 알 수 있습니다.

기본의 예시docker-compose.yml:

version: '2'
services:
  web:
    image: sdelements/lets-chat
    stdin_open: true
    secrets:
    - name-of-secret
    labels:
      io.rancher.container.pull_image: always
secrets:
  name-of-secret:
    external: true

"How to Update a Single Running Docker-compose Container"에 나와 있듯이, 컨테이너를 업데이트하려면 "build, kill, up" 시퀀스가 필요합니다.

docker-compose up -d --no-deps --build <service_name>

언급URL : https://stackoverflow.com/questions/47615751/docker-compose-run-a-script-after-container-has-started

반응형