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
다음 빌드 단계에서 나중에 실행할 사전 지침을 등록합니다.
작동 방식은 다음과 같습니다.
- 그것이 마주쳤을 때.
ONBUILD
작성자는 빌드 중인 이미지의 메타데이터에 트리거를 추가합니다.이 명령은 현재 빌드에 영향을 주지 않습니다. - 빌드가 끝나면 모든 트리거 목록이 이미지 매니페스트의 키 아래에 저장됩니다.
OnBuild
이를 통해 검사할 수 있습니다.docker inspect
지휘권 - 나중에 이미지를 사용하여 새 빌드의 기본으로 사용할 수 있습니다.
FROM
설명일. 처리로를 하는 과정의 .FROM
지시, 다트림찾것는빌을 .ONBUILD
등록된 순서대로 트리거하고 실행합니다. 중 실패할 , "트리거"는 다음과 같습니다.FROM
명령이 중단되어 빌드가 실패합니다. 트리거가하면, 모트리성공면하가거든,FROM
명령이 완료되고 빌드가 정상적으로 계속됩니다. - 트리거는 실행된 후 최종 영상에서 지워집니다.다시 말해, 그들은 "손주" 건물에 의해 상속되지 않습니다.
도커 합성에서는 다음을 정의할 수 있습니다.
다시 시작: 아니요
컨테이너를 한 번만 실행합니다. 예를 들어 DB 마이그레이션 컨테이너에 유용합니다.
프로그램이 작동하려면 초기 상태가 필요합니다.즉, 다음을 수행해야 합니다.
- 필요한 상태가 이미 있는지 확인합니다.
- 첫 번째 단계 결과 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
'it-source' 카테고리의 다른 글
vuex 저장소에서 "Uncaught TypeError: 정의되지 않은 속성 'get'을 읽을 수 없음"을 어떻게 해결할 수 있습니까? (0) | 2023.06.20 |
---|---|
점이 너무 많은 산점도 (0) | 2023.06.20 |
Panda DataFrame에서 열 지도 만들기 (0) | 2023.06.20 |
정적 C 라이브러리를 C++ 코드와 연결할 때 "정의되지 않은 참조" 오류 발생 (0) | 2023.06.20 |
Google에서 Python을 많이 사용합니다. (0) | 2023.06.20 |