Docker의 SQL 오류

Docker의 SQL 오류

내 목표는 Dockerfile에서 SQL 사용자를 생성하고 그에게 몇 가지 권한을 부여하는 몇 가지 명령을 실행하는 것입니다. 그래서 나는 다음을 수행합니다.

FROM ubuntu:18.04
...
RUN apt-get install -y apache2
RUN apt-get install -y mysql-server
RUN mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
RUN mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"

첫 번째 mysql 명령에서 충돌이 발생합니다.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

그러나 StackExchange를 통해 Dockerfile에서 sql 명령을 제거하고 실행 중인 컨테이너에서 docker exec로 로그인하면 다음 솔루션이 작동하는 것으로 확인되었습니다.

service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"

모든 명령이 Dockerfile에 있기를 원하기 때문에 위의 service stop/start솔루션을 시도했지만 이미 실행 중인 컨테이너에서 실행한 후에만 Dockerfile에서 작동하지 않습니다. 다른 해결책이 필요하다고 생각합니다.

docker exec를 사용하여 수동으로 실행하지 않고도 이러한 SQL 명령 실행을 자동화하려면 어떻게 해야 합니까? 감사합니다

추신: 질문이 다른 Stack Exchange 사이트에 더 적합한지 알려주세요.

답변1

문제는 모든 RUN 명령이 다른 계층에서 실행된다는 사실과 관련이 있습니다. 해결책은 모든 관련 명령을 bash 스크립트 init_db.sh 파일에 추가하고 Dockerfile에서 실행하는 것이었습니다.

#!/bin/bash

service apache2 stop
service mysql stop
service mysql start
service apache2 start

mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

원천:https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile

관련 정보