나는이 작업을 수행하고 있지만 잠재적 인 부작용이 있는지 또는 더 좋은 방법이 있는지 궁금해하고 있습니다. 아래 예는 일반적인 것입니다.피드백 요청 - 파일 변경시 Docker 컨테이너 다시 시작
두 개의 컨테이너 (container_1
및 container_2
)가있는 도킹 스테이션 작성 파일이 있습니다.
container_1
은 설치된 서비스를 실행하는 데 사용되는 다양한 구성 파일이 들어있는 볼륨을 노출합니다.
container_2
은 볼륨을 container_1
에서 마운트하고 파일을 가져오고 container_1
에서 실행되는 서비스 구성을 업데이트하는 스크립트를 주기적으로 실행합니다.
configs가 업데이트 될 때마다 또는 내가 본 것으로 설명한 일부 방법을 사용하지 않고 container_1
에서 서비스를 다시 시작하려고합니다.
내 솔루션 : 나는 설정 파일이 업데이트되었는지 확인 container_1
에 스크립트를 넣어
가 (파일이 처음에 비어 있고 그 md5sum이 별도의 파일에 저장) 및 파일이 변경된 경우 md5sum을 기반으로 현재 해시를 업데이트하고 프로세스를 종료합니다.
작성 파일에 주기적으로 스크립트를 실행하는 healthcheck
이 있고 restart
은 always
으로 설정되어 있습니다. container_2
의 스크립트가 실행되어 container_1
의 설정 파일을 monitor_configs.sh
에 업데이트하면 container_1
의 스크립트가 서비스 프로세스를 중지하고 컨테이너가 다시 시작되고 configs가 다시로드됩니다.
monitor_config.sh
# current_hash contains md5sum of empty file initially
#!/bin/sh
echo "Checking if config has updated"
config_hash=$(md5sum /path/to/config_file)
current_hash=$(cat /path/to/current_file_hash)
if [ "$rules_hash" != "$current_hash" ]
then
echo "config has been updated, restarting service"
md5sum /path/to/config_file > /path/to/current_file_hash
kill $(pgrep service)
else
echo "config unchanged"
fi
고정 표시기 - compose.yml
version: '3.2'
services:
service_1:
build:
context: /path/to/Dockerfile1
healthcheck:
test: ["CMD-SHELL", "/usr/bin/monitor_config.sh"]
interval: 1m30s
timeout: 10s
retries: 1
restart: always
volumes:
- type: volume
source: conf_volume
target: /etc/dir_from_1
service_2:
build:
context: /path/to/Dockerfile2
depends_on:
- service_1
volumes:
- type: volume
source: conf_volume
target: /etc/dir_from_1
volumes:
conf_volume:
나는이 healthcheck
의 용도 아니라는 것을 알고 있지만를 얻을 수있는 가장 깨끗한 방법처럼 보였다 각 컨테이너에서 하나의 실행중인 프로세스 만 유지하면서 원하는 효과를 얻을 수 있습니다.
나는 tini
을 container_1
에 넣고 시도했지만 두 경우 모두 예상대로 작동하는 것 같습니다.
container_2
의 스크립트는 하루에 한 번만 실행되므로 healthcheck
의 interval
을 24 시간 연장 할 계획입니다.
사용 사례
내가 Suricata에 대한 규칙을 업데이트 container_2
에 container_1
및 풀드 포크에 Suricata를 실행하고 있습니다. 하루에 한 번 뽑아서 껍질을 벗기고 규칙을 업데이트 한 경우 Suricata를 다시 시작하여 새 규칙을로드합니다.
고맙습니다 ... 나는 분명히 confd를 살펴 봐야 할 것입니다. 제가 잘하고있는 몇 가지 다른 것들에도 도움이 될 것 같습니다. –