프로젝트에서 mysql 컨테이너를 만들 필요가 있었다.
도커-mysql-컨테이너-초기-데이터-삽입
그런데 컨테이너 생성 후 초기 데이터를 넣어주는 과정에서 오류가 발생하였다.
// dockerfile
FROM mysql:8.0.32
ENV MYSQL_ALLOW_EMPTY_PASSWORD=true
ADD ./vms_database_init_script /docker-entrypoint-initdb.d
EXPOSE 3306
위처럼 도커파일을 만들어주었고
빌드 후 run 하였더니
이런 에러가 발생하였다.
문제가 발생한 sql 파일은
use mysql;
ALTER user root@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER root@'%' IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER aidev@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER aidev@'%' IDENTIFIED WITH mysql_native_password BY 'password';
create database pntbiz_vms default character set utf8;
GRANT ALL PRIVILEGES ON pntbiz_vms.* TO aidev@'localhost';
GRANT ALL PRIVILEGES ON pntbiz_vms.* TO aidev@'%';
flush privileges;
sql 파일들은 모두 이사님이 로컬 디비 세팅할 때 사용하셨던 sql문 이었다.
의 부분에서 2번째 줄의 CREATE USER root@'%' IDENTIFIED WITH mysql_native_password BY 'pntbiz1234';
여기 부분에서 에러가 났다.
분명 root@localhost 와 root@%는 다른 계정일텐데 create user에 오류가 발생하였다.
저 부분을 지우고 실행 시키자 다른 모든 sql문이 잘 작동 하는 것이었다.
의심든 것은 mysql 공식 이미지 였다.
혹시 컨테이너 생성시에 외부접속 권한이 있는 root 계정또한 만들어 지도록 설정해 놓은 것이 아닐까?
컨테이너 생성 시 바인딩 해둔 3305 포트로 연결해 보았다.
역시나 였다.
root@localhost 뿐 아니라 root@% 계정까지 기본적으로 생성되는 것이었다.
create user가 아닌 alter user를 했어야 했다!
ALTER user root@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY 'password';
이렇게 바꾸어 주니 잘 작동하였다!!
그렇다면... 혹시 dockerfile에서
ENV MYSQL_ROOT_PASSWORD=비밀번호
이렇게 해주면 ALTER를 할 필요도 없는 것 아닐까?
dockerfile에 ENV MYSQL_ROOT_PASSWORD=비밀번호 을 추가해주고
ALTER 문을 다 지운 후에 이미지 빌드 후 컨테이너를 실행해주었다
예상대로 루트계정에 비밀번호가 제대로 들어가 있었다!
mysql 공식 이미지로 컨테이너 생성시
root@localhost 와 root@% 계정이 모두 생성된다.
dockerfile에
ENV MYSQL_ROOT_PASSWORD=비밀번호
옵션을 주면
root@localhost와 root@% 계정 모두에 해당 비밀번호로 생성된다.