인프런 커뮤니티 질문&답변

unchaptered님의 프로필 이미지
unchaptered

작성한 질문수

따라하며 배우는 도커와 CI환경 [2023.11 업데이트]

Docker Compose 파일 작성하기

compose-up mysql 관련 에러 뜨시는 분들

작성

·

1.4K

2

아래가 마주한 에러 및 경고 상황이며, 제가 해결한 방법 공유하는 내용입니다.

1. –initialize specified but the data directory has files in it. Aborting.
2. Can't change permissions of the file 'ca-key.pem' 

제 개발 운영체제는 다음과 같았습니다.

- OS : Windows 10
- IDE : VSC
- Docker : V 20.10.14
- Docker Desktop : 4.7.1 (77678)
- Github Reopsitory : https://github.com/unchaptered/22-05-docker-react-proxy

 

1번 문제 원인 (추정)

1. Docker + MySQL 설정
2. Windows 10 / Home 환경일 것
3. 어떤 문제로 1번 이상 mysql_data 을 지웠을 경우
4. 모든 캐시를 지우고 docker-compose 를 재시작 한 경우

2번 문제 원인 (추정)

1. MySQL v5.7 으로 명시한 분들

 

1번 Initial 문제

해결방법 / 우려 / 원인 / 참조글 이 포함되어있습니다.

[해결방법]
docker-compose.yml 파일에서 volume 항목 주석 처리 할 것

[우려]
실제로 백앤드 개발환경에서 작업을 하는 경우에는 코드 수정 등으로 테스트를 다시 해야 되는 경우가 있습니다. 또한 개발 기간이 1주만 넘어가도 정크 데이터가 많이 쌓입니다.

이러한 경우 저는 데이터를 지우는 과정을 따로 하는데요.
결국 개발 환경에서 Volume 이 주는 사이드 이펙트의 일부가 DB 를 지우는 것이고 크게 문제되지는 않을 것이라고 생각합니다.

실제 저희가 배포하게 될 버저넹서는 RDS 를 사용할 것이기 때문입니다.

[원인]
MySQL 초기화 과정부터 살펴보면,
일반적으로 *.exe 파일로 설치하게 되면 이 부분이 명시적으로 드러나지만, 커맨드 쉘 혹은 컨테이너 등을 거치게 되면 이 부분을 최초에 바로 넣어주고 실행하게 되는 것 같습니다.

그러면 설치 과정에서 환경변수 파일들이 생성되고 사용가능한 상태에 도달하는 것 같습니다. 그 결과로 한번 docker-compose up 을 하고나면 ~/mysql/ 안에 새로운 폴더가 생기는 것을 체크하실 수 있습니다.
다만 이 친구의 생성은 volume 옵션과 무관하게 생기는데(옵션을 지워도 생김) 왜 로컬 환경에 파일이 생성되는 지는 알 수 없습니다.

 

그러한 초기화 환경 에서 강의에서는 volume 옵션을 사용하여 변화가 되는 부분만 실행되게 만들어주신 것 같습니다.

결과적으로 DROP DATABASE IF EXISTS 구문은 수정하지 않을 시에, 실행 되지 않게 되어서 운영환경에서 데이터가 보존되는 것입니다.

 

문제가 되는 지점은 여기인데요.
VOLUME 에 지정된 파일은 docker 가 관리하는 컨테이너 파일이 아니라, 파일 시스템상 디랙토리 로 취급됩니다.

자 그러면 이 부분이 왜 문제가 되었는가 추측을 해보면,
특정한 이슈가 있으셔서 컨테이너를 지우고 다시 만든 경우 가 있다고 한다면 아래 세 가지 코드로 깔끔하게 지울 수 있습니다.

1. docker-compose down --volumes
2. docker system prune --volumes
3. docker rmi $(docker images -q)

이렇게 되면, 이미지/컨테이너/볼륨 이 전부 제거가 되는데요. 이렇게 한 번 제거를 하고 나서 docker-compose up 을 시키고 나면 그떄부터 -initial ~~~ 에러가 지긋지긋하게 저를 따라다닙다.

 

관련된 내용이 Stackoverflow 에 나와있었으나,
솔직히 도커, 리눅스 등에 대한 이해도도 떨어져서 솔루션을 찾을 수 없었습니다. 그러나 강사님께서 제공해주신 교안 파일 및 github repo 를 보면 mysql 은 RDS 를 사용하기 때문에 이러한 문제를 외면해도 되는 것일까 라는 방법을 생각했습니다.

 

결과적으로 compose-docker.yml 에서 mysql: volume: 항목을 전부 주석 처리해주시면 이 문제가 발생하지 않습니다.

 

[참조글]

Stackoverflow - docker-compose volume 에러 (아마도 같은 수강생 분이 남긴 질무닝 아닐까 싶네요 하하)
programmerah - Linux error -initialization 에러 

 

2번 문제

[해결방법]
mysql: 5.7 을 mysql:5.7.16 으로 명시

[원인]
mysql: 5.7 이라고 적게되면,
그 뒤에 상세 버전을 가장 최신 으로 설치하게 되는데 그 버전에서 경고 문구가 뜬다는 내용이 있습니다.

혹시 경고 문구가 찜찜하시다면 아래 참조 포스트 혹은 구글링 해보시는 것을 추천드립니다.

[참고글]
Github Issue - Can't change permissions of the file 'ca-key.pem'

답변 4

0

unchaptered님의 프로필 이미지
unchaptered
질문자

해당 방법으로 VOLUME 에서 제외할 시,
initialize.sql 가 실행 되지 않는 문제가 발생했습니다.

저는 다른 개발 환경으로 개발할 것이기 때문에, 빠르게 우회하여 해결하는 방법만 공유해드립니다.

 

docker-compose up --build 로 실행

docker ps 로 mysql 컨테이너 id 찾기

docker exec -it mysql_id bash 로 커맨드 창

mysql -u root -p 비밀번호(yml 안에 환경 변수로 적힌 것)

show databases;

drop database if exists myapp;

create databases myapp;

use myapp;

create table lists (

   id INTEGER AUTO_INCREMENT,

   value TEXT,

   PRIMARY KEY (id)

);

 

를 커맨드 창에 순차 실행

 

0

unchaptered님의 프로필 이미지
unchaptered
질문자

누군가에게 도움이 되었길 빌면서,
혹시 사실과 다른 내용이 있다면 정정해주시면 감사하겠습니다.

0

unchaptered님의 프로필 이미지
unchaptered
질문자

WLS2 에서는 Volume 이 정상작동하지 않습니다.

아마 이 부분까지 강의를 들으신 분중 Windows 운영체제를 쓰시는 분들은 volume 이 windows 환경에서 제대로 작동하지 않음을 알게 되었을 겁니다.

하지만 이 부분이 의아한 것은 Docker 라는 프로그램이 설치된 OS 가 Windows 인 거지 Docker 라는 시스템은 다른 운영체제로 돌아가기 때문입니다.

문제가 발생하는 지점은 정확하게 wls2 이며, 윈도우에서 리눅스 커맨드를 입력하기 위한 창입니다.

이 친구가 volume 을 비정상 작동하도록 만들게 하고 있으며, 1번과 2번 문제 모두 컨테이너 생성은 리눅스 쉘 에서 하고 exec 로 접근해서 사용하는 것을 일반적인 쉘에서 하면 될 것이라는 말이 있었습니다.

하지만 그 정도의 깊이가 있는 사람이라면 아마 도커를 혼자 공부하고 있지 않을까... ㅠㅠㅠ 해서 결론은 win 이라면,그냥 volume 을 지우시거나 따로 공부하셔서 mount 라는 기능 쓰시는게 좋지 않을까 싶습니다.

아마 이 부분까지 강의를 들으신 분중 Windows 운영체제를 쓰시는 분들은 volume 이 windows 환경에서 제대로 작동하지 않음을 알게 되었을 겁니다.

하지만 이 부분이 의아한 것은 Docker 라는 프로그램이 설치된 OS 가 Windows 인 거지 Docker 라는 시스템은 다른 운영체제로 돌아가기 때문입니다.

문제가 발생하는 지점은 정확하게 wls2 이며, 윈도우에서 리눅스 커맨드를 입력하기 위한 창입니다.

이 친구가 volume 을 비정상 작동하도록 만들게 하고 있으며, 1번과 2번 문제 모두 컨테이너 생성은 리눅스 쉘 에서 하고 exec 로 접근해서 사용하는 것을 일반적인 쉘에서 하면 될 것이라는 말이 있었습니다.

하지만 그 정도의 깊이가 있는 사람이라면 아마 도커를 혼자 공부하고 있지 않을까... ㅠㅠㅠ 해서 결론은 win 이라면,그냥 volume 을 지우시거나 따로 공부하셔서 mount 라는 기능 쓰시는게 좋지 않을까 싶습니다.

0

unchaptered님의 프로필 이미지
unchaptered
질문자

리눅스 운영체제에서의 덮어씌우기 / 작성하기 구분

1번과 2번 모두 Docker, MySQL Initialization 과정에서 발생하는 문제입니다. 더 정확히 표현하자면 MySQL 설치하려고 하는데 기존에 설치된 파일 이 있어서 충돌이 일어났고 그 결과 Aborting(중단) 되버린 것입니다.

일반 PC 환경에서는 그냥 덮어씌우거나 어떤 방법대로 안내를 받지만, 리눅스에서는 덮어씌우기 와 작성하기 자체가 구분되어 있기 때문에 Aborting 이 무한히 반복되는 상황일 것일 겁니다.

unchaptered님의 프로필 이미지
unchaptered

작성한 질문수

질문하기