도커 컨테이너 내부에서 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
'programing' 카테고리의 다른 글
Symfony 3.4.6 - 10.1.37-MariaDB-0+deb9u1 - 인덱스 열 크기가 너무 큼 (0) | 2022.10.08 |
---|---|
치명적 오류: 문자열에 대해 [] 연산자가 지원되지 않습니다. (0) | 2022.10.08 |
'super'는 Python에서 무엇을 합니까? - super()의 차이점.__init__() 및 명시적 슈퍼클래스 __init_() (0) | 2022.10.08 |
문자열 스트레이트 JavaScript 잘라내기 (0) | 2022.10.08 |
Flask/Jinja2를 사용하여 HTML을 템플릿으로 전달 (0) | 2022.10.08 |