programing

도커 컨테이너 내부에서 MariaDB를 수행할 수 없습니다.

luckcodes 2022. 10. 8. 09:58

도커 컨테이너 내부에서 MariaDB를 수행할 수 없습니다.

기존 Docker 컨테이너 안에서 MariaDB를 실행해야 합니다.

구축 및 설치는 정상적으로 동작하지만 Docker가 실행되면

RUN mysql < init.sql

DB 스키마를 로드하다

Can't connect to MySQL server (111 Connection refused)

하지만 컨테이너를 실행하고

docker exec -it silly_allen /bin/bash -c "mysql < init.sql" 

잘 작동합니다.

뭐가 문제죠?

감사합니다!

편집: DB와 관련된 Docker file의 일부입니다.

FROM centos:7

WORKDIR /root

...
RUN echo "[mariadb]" >> /etc/yum.repos.d/MariaDB.repo
RUN echo "name = MariaDB" >> /etc/yum.repos.d/MariaDB.repo
RUN echo "baseurl = http://yum.mariadb.org/10.1/centos7-amd64" >> /etc/yum.repos.d/MariaDB.repo
RUN echo "gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" >> /etc/yum.repos.d/MariaDB.repo
RUN echo "gpgcheck=1" >> /etc/yum.repos.d/MariaDB.repo
RUN rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
RUN yum install -y MariaDB-server MariaDB-client
RUN yum clean all

RUN echo "[mysqld]" > /etc/my.cnf
RUN echo "bind-address=0.0.0.0" >> /etc/my.cnf

RUN /etc/init.d/mysql restart

ADD init.sql /root
RUN mysql < /root/init.sql
...

Docker의 베스트 프랙티스에 따르면 실행하려는 프로세스당 컨테이너가 1개 있어야 합니다.

또한 공식 mariadb 이미지는 SQL 덤프를 포함할 수 있는 디렉토리를 볼륨으로 마운트할 수 있습니다.이러한 덤프는 컨테이너가 생성될 때 자동으로 Import되므로 편리할 수 있습니다.

매우 큰 도커파일을 1개 보유하는 대신 다른 서비스로 분할하는 것이 좋습니다.docker-compose

만약 이대로 있고 싶다면, 난 당신이 이걸 옮기는 것을 추천한다.ADD init.sql ...part to top, 서버 시작 부분과 덤프 Import를 연결합니다.각각의 이유로RUN명령어는 Docker와 함께 별도의 레이어입니다.따라서 이 StackOverflow 질문의 답변에 기재되어 있는 것과 같은 것이 필요합니다.

RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /root/init.sql

서버가 초기화되어 덤프가 1개의 레이어로 Import 됩니다.

내가 보기에 넌 도망가려고 하는 것 같아mysql < init.sql를 클릭합니다.이 오류는 이 명령어를 사용하려면 데이터베이스가 실행 중이어야 함을 나타냅니다.

이 문제를 해결하려면 다음을 포함하는 시작 스크립트를 컨테이너에 추가하십시오.

mysqld
mysql < init.sql

Dockerfile CMD를 변경하여 이 스크립트를 호출합니다.

이 방법이 맞습니다.

# cat Dockerfile 
...
ADD init.sql /tmp
ADD initdb.sh /tmp
RUN /tmp/initdb.bash
CMD ["/usr/bin/mysqld_safe --datadir=/var/lib/mysql"]

그리고 스크립트:

# cat dump/initdb.bash 
#!/bin/bash

set -e
set -x

mysqld_safe --datadir='/var/lib/mysql' --user=root &
until mysqladmin ping >/dev/null 2>&1; do
   sleep 0.2
done

mysql -e 'create database init;' && \
mysql init < /tmp/init.sql && \
echo "Successfully imported" && exit 0

언급URL : https://stackoverflow.com/questions/45710469/cant-mariadb-inside-docker-container