sourcetip

도커 컨테이너 실행 시 자동으로 서비스를 시작하는 방법은?

fileupload 2023. 10. 30. 21:12
반응형

도커 컨테이너 실행 시 자동으로 서비스를 시작하는 방법은?

MySQL 서버를 컨테이너에 설치하기 위한 도커 파일이 있으며, 다음과 같이 시작합니다.

sudo docker run -t -i 09d18b9a12be /bin/bash

그러나 MySQL 서비스가 자동으로 시작되는 것이 아니라 컨테이너 내에서 수동으로 실행해야 합니다.

service mysql start

도커 컨테이너를 실행할 때 MySQL 서비스를 자동으로 시작하려면 어떻게 해야 합니까?

첫째, 당신의 몸에 문제가 있습니다.Dockerfile:

RUN service mysql restart && /tmp/setup.sh

도커 이미지는 실행 중인 프로세스를 저장하지 않습니다.그러므로 당신의RUN명령은 다음 기간 동안만 실행됩니다.docker build단계 및 빌드가 완료된 후 중지됩니다.대신 컨테이너를 시작할 때 명령을 지정해야 합니다.CMD아니면ENTRYPOINT다음과 같은 명령:

CMD mysql start

둘째, 도커 컨테이너가 계속 실행되기 위해서는 프로세스(마지막 명령)가 필요합니다. 그렇지 않으면 컨테이너가 종료/정지됩니다.따라서 정상적인service mysql start명령은 도커 파일에서 직접 사용할 수 없습니다.

해결책

프로세스를 계속 실행하는 일반적인 세 가지 방법이 있습니다.

  • 으로.service명령 후에 non-end 명령을 추가합니다.tail -F

    CMD service mysql start && tail -F /var/log/mysql/error.log
    

출력된 로그를 도커가 액세스할 수 있도록 하므로 단일 서비스가 실행 중인 경우 이를 선호하는 경우가 많습니다.

  • 또는 foreground 명령을 사용하여 이 작업을 수행합니다.

    CMD /usr/bin/mysqld_safe
    

다음과 같은 스크립트가 있는 경우에만 작동합니다.mysqld_safe.

  • 또는 스크립트를 다음으로 래핑합니다.start.sh그리고 이것을 끝까지 집어넣어라.

    CMD /start.sh
    

명령이 일련의 단계를 다시 수행해야 하는 경우 이 방법이 가장 좋은 방법입니다./start.sh계속 뛰어야 합니다

메모

사용하는 초보자용supervisord권장되지 않습니다.솔직히 너무 많이 죽였습니다.컨테이너는 단일 서비스/단일 명령어를 사용하는 것이 훨씬 좋습니다.

BTW: https://registry.hub.docker.com 에서 기존의 mysql 도커 이미지를 확인하여 참고하시기 바랍니다.

당신의Dockerfile, 마지막 줄에 덧셈

ENTRYPOINT service ssh restart && bash

저한테 효과가 있습니다.

결과는 이렇습니다.

root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
 * Restarting OpenBSD Secure Shell server sshd   [ OK ]                                                                      
root@dccc354e422e:~# service ssh status
 * sshd is running

간단! 도커 파일 끝에 추가:

ENTRYPOINT service mysql start && /bin/bash

제가 항상 더 쉽게 읽을 수 있는 또 다른 방법이 있습니다.

실행할 때 rabbitmq와 mongodb를 시작하고 싶다고 말하고 나서 당신의CMD다음과 같은 모습일 것입니다

CMD /etc/init.d/rabbitmq-server start && \
    /etc/init.d/mongod start

하나만 가질 수 있으니까요.CMD인당의Dockerfile요령은 모든 지시를 연결하는 것입니다.&&그 다음에 사용합니다.\각 명령에 따라 새 줄을 시작합니다.

이 중 많은 것을 추가한다면 @larry-cai가 제안한 것처럼 스크립트 파일에 모든 명령을 넣고 시작할 것을 제안합니다.

CMD /start.sh

안 됩니다.CMD service mysql start && /bin/bash

안 됩니다.CMD service mysql start ; /bin/bash ;

-- 대화형 모드는 포그라운드를 지원하지 않을 것 같습니다.

잘 되네요!!CMD service nginx start ; while true ; do sleep 100; done;

잘 되네요!!CMD service nginx start && tail -F /var/log/nginx/access.log

사용해야 할 주의.docker run -p 80:80 nginx_bash명령 매개 변수가 없습니다.

제 경우에는 MYSQL 백엔드 데이터베이스에 연결되는 도커 컨테이너 내에서 Apache2에서 PHP 웹 애플리케이션을 제공하고 있습니다.Larry Cai의 해결책은 약간의 수정을 거쳤습니다.제가 만든 것은.entrypoint.sh제가 서비스를 관리하고 있는 파일입니다.내 생각엔 우리가 한 일을.entrypoint.sh컨테이너가 시작될 때 실행할 명령이 둘 이상 있을 때 부트스트랩 도커를 실행하는 것이 더 쉬운 방법입니다.

#!/bin/sh

set -e

echo "Starting the mysql daemon"
service mysql start

echo "navigating to volume /var/www"
cd /var/www
echo "Creating soft link"
ln -s /opt/mysite mysite

a2enmod headers
service apache2 restart

a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload

if [ -z "$1" ]
then
    exec "/usr/sbin/apache2 -D -foreground"
else
    exec "$1"
fi

코드를 한 번만 실행하기 위해 /root/.bashrc에 다음 코드를 추가합니다.

이 스크립트를 실행하기 전에 이미지에 컨테이너를 커밋하십시오. 그렇지 않으면 이미지에 'docker_services' 파일이 생성되고 서비스가 실행되지 않습니다.

if [ ! -e /var/run/docker_services ]; then
    echo "Starting services"
    service mysql start
    service ssh start
    service nginx start
    touch /var/run/docker_services
fi

ssh 서비스를 자동으로 시작하고 싶을 때도 같은 문제가 있습니다.그 부록을 찾았습니다.

/etc/init.d/ssh 시작
to
~/.bashrc
can resolve it ,but only you open it with bash will do.

도커 컨테이너가 실행될 때마다 MySQL 서비스를 자동으로 시작하는 방법은 다음과 같습니다.

제 경우에는 MySQL 뿐만 아니라 PHP, Nginx, Memcached 를 실행해야 합니다.

도커 파일에 다음 행이 있습니다.

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
EXPOSE 3306
CMD service mysql start && service php-fpm start && nginx -g 'daemon off;' && service memcached start && bash

&bash를 추가하면 Nginx, MySQL, PHP 및 Memcached가 컨테이너 내에서 계속 실행됩니다.

docker export -o <nameOfContainer>.tar <nameOfContainer>

도커 가지치기를 사용하여 기존 컨테이너를 가지치기해야 할 수 있습니다...

필요한 수정 사항과 함께 가져오기:

cat <nameOfContainer>.tar | docker import -c "ENTRYPOINT service mysql start && /bin/bash" - <nameOfContainer>

다음과 같이 항상 재시작 옵션과 함께 컨테이너를 실행하여 호스트/대몬 재활용 후 자동으로 재개되도록 합니다.

docker run -d -t -i --restart always --name <nameOfContainer> <nameOfContainer> /bin/bash

사이드 노트:제 생각에는 컨테이너를 가능한 깨끗한 상태에서 cron 서비스만 시작하고 cron tab이나 cron만 수정하는 것이 타당합니다.시간당, .daily 등...이에 상응하는 점검/모니터링 스크립트를 제공합니다.이유는 하나의 데몬에만 의존하기 때문이며 변경의 경우 부팅 시 시작되는 서비스를 추적하는 대신 ansible 또는 puppet을 사용하면 cron 스크립트를 재배포하는 것이 더 쉽습니다.

ENTRYPOINT name-service

도커 파일 안에

예:

ENTRYPOINT mysqld_explorer

/etc/systemd/system/mysqld_explorer.service

도커 웹사이트의 다음 문서는 도커 컨테이너에 SSH 서비스를 구현하는 방법을 보여줍니다.서비스에 쉽게 적응할 수 있어야 합니다.

이 질문에 대해서도 다양한 질문이 제기되고 있습니다.

도커 파일 / docker 이미지를 변경할 수 없는 경우.해결 방법은 다음과 같습니다.

docker run image ID bash -c'service mysql start; while true; do sleep 100; done; done; '

사용중입니다docker-compose.yml(버전: "3.9")

제가 하는 일은 아래와 같은 명령어를 서비스에 추가하는 것입니다.docker-compose.yml서비스를 시작하고 비엔드 프로세스를 실행합니다.

command: /bin/sh -c "service mysql start; while sleep 1000; do :; done"

여기서 힌트를 찾기 전에 몇 시간 동안 계속 찾고 있었습니다.위의 내용을 수정했습니다.

  • CMD:'/bin/sh' '-c' '/mypath/startup.sh; bash'
  • "mypath"는 지속적인 볼륨에 있으며, 여기에 startup.sh 을 배치했습니다.

Portainer(2.11.1)에서는 "명령"에 "엔트리포인트"가 여전히 비어 있습니다.

당신이 당신의 주요 프로세스를 pid 1로 실행하기를 원하지만 또한 cron을 시작하거나 다른 서비스를 시작하고 싶다고 말하면 당신은 다음과 같은 것을 추가할 수 있습니다.

#make sure some other service starts on container start, tested in Ubuntu 20.04 based container
RUN echo "cron" >> /etc/bash.bashrc

CMD ["myproc"] #should run as 1 to receive sigterm

이러한 접근 방식을 사용할 가능성은 높지만 테스트하지는 않았지만 메인 프로세스 외에 서비스를 시작하는 것과 같은 작업을 수행할 수 있습니다.

RUN echo "service mysql start" >> /etc/bash.bashrc

CMD ["myproc"] #should run as 1 to receive sigterm

기본적으로 사용자 정의 엔트리를/etc/bash.bashrc시스템(container) 시작 시 실행됩니다.다시 Ubuntu 20.04, 다른 버전에서는 시스템bashrc이름이 다를 수 있습니다.

언급URL : https://stackoverflow.com/questions/25135897/how-to-automatically-start-a-service-when-running-a-docker-container

반응형