programing

Maria DB 도커 액세스가 사용자 'root'@'localhost'에 대해 거부되었습니다.

procenter 2022. 10. 10. 20:52
반응형

Maria DB 도커 액세스가 사용자 'root'@'localhost'에 대해 거부되었습니다.

MariaDB 도커 이미지를 사용하고 있는데 경고 메시지가 계속 표시됩니다.

[Warning] Access denied for user 'root'@'localhost' (using password: NO)

이미지 작성에 사용되는 도커 파일입니다.

FROM mariadb:10.6.4
ENV MYSQL_ROOT_PASSWORD pw
ENV MARIADB_DATABASE db1
ENV MARIADB_USER user1
ENV MARIADB_PASSWORD user1pw

컨테이너를 docker-composure로 시작합니다.

mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    ports:
      - 2306:3306  

그리고 다음 방법으로 다른 컨테이너에서 컨테이너에 액세스합니다.

mysql+pymysql://user1:user1pw@mariadb_container:3306/db1

구글이 찾은 솔루션 대부분은 SQL 문 같은 것을 실행하고 있었지만 도커 컨테이너를 실행하고 있기 때문에 일시적인 솔루션이 필요합니다.도커에서 이걸 어떻게 고칠지 아는 사람?

----- EDIT-----

상태 체크 섹션을 도커 컴포지트 파일에 추가하는 것을 잊었습니다.

mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    ports:
      - 2306:3306  
    healthcheck:
      test: ["CMD-SHELL", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

갱신하다

질문의 업데이트를 기반으로 다음 명령을 실행하려고 합니다.mysqladmin ping명령어를 입력합니다. mysqladmin접속을 시도하고 있습니다.root사용자이지만 데이터베이스 서버에 대해 인증하려면 암호가 필요합니다.

패스워드를 지정할 수 있습니다.mysqladmin기준:

  • 사용방법-p명령줄 옵션
  • 사용방법MYSQL_PWD환경 변수
  • 인증 정보 파일 생성

루트 패스워드를 이미지에서 이동시키고 대신 실행 시 설정해당 패스워드를 기입할 수 있습니다.docker-compose.yml다음과 같은 파일:

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    environment:
      - "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
      - "MYSQL_PWD=$MYSQL_ROOT_PASSWORD"
    healthcheck:
      test: ["CMD-SHELL", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

그리고 우리 안에.env설정할 수 있는 파일:

MYSQL_ROOT_PASSWORD=pw1

이제 컨테이너가 시작된 후 컨테이너가 정상인지 확인합니다.

$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                    PORTS      NAMES
c1c9c9f787e6   mariadb_image    "docker-entrypoint.s…"   28 seconds ago   Up 27 seconds (healthy)   3306/tcp   mariadb_container

참고로 이 예에서는 커스텀이미지를 빌드하는 이유를 명확하게 알 수 없습니다.환경변수는 "빌드인" credential로 작성하는 것보다 런타임에 설정하는 것이 좋습니다.


이전 답변

사용 시 문제를 재현할 수 없습니다.mysql클라이언트 코드 또는 Python 코드.이하에 기재되어 있는 경우docker-compose.yml:

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.

  shell:
    image: mariadb:10.6.4
    command: sleep inf

(디렉토리)topcat_mariadb를 포함합니다.Dockerfile문의해 주세요.)

만약 내가 실행 시shell컨테이너:

docker-compose exec shell bash

그리고 달려라mysql다음과 같습니다.

mysql -h mariadb_container -u user1 -p db1

동작은 양호합니다.

root@4fad8e8435df:/# mysql -h mariadb_container -u user1 -p db1
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.6.4-MariaDB-1:10.6.4+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [db1]>

sqlalchemy를 사용하고 있는 것 같습니다.Python 컨테이너를 믹스에 추가하는 경우:

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.

  shell:
    image: mariadb:10.6.4
    command: sleep inf

  python:
    image: python:3.9
    command: sleep inf

그런 다음 다음 Python 코드를 실행합니다.python컨테이너:

>>> import sqlalchemy
>>> e = sqlalchemy.engine.create_engine('mysql+pymysql://user1:user1pw@mariadb_container:3306/db1')
>>> res = e.execute('select 1')
>>> res.fetchall()
[(1,)]

또, 문제없이 동작하고 있는 것 같습니다.

언급URL : https://stackoverflow.com/questions/69708629/maria-db-docker-access-denied-for-user-rootlocalhost

반응형