본문으로 바로가기
728x90
반응형

개요

시도하고자 했던 것은 테스트에 필요한 DB 환경을 로컬에 만들 때  Dockerfile에 `mysql -u root -p DB_NAME < *. sql` 와 같은 명령 입력단계를 없애보고 싶은 생각에서 출발했습니다. Dockerfile에는 특정 명령을 통해 컨테이너가 실행될 때 또는 실행되면서 동작해야 할 내용을 적을 수 있는데 이 과정에서 `mysql -u root -p DB_NAME < *. sql` 이 명령어가 실행이 안 되는 현상을 발견했습니다

 

apt-key 추가

Dockerfile에서 apt update가 안 되는 현상을 겪었는데 다음과 같이 apt-key를 넣어줌으로써 해결했습니다.

$ RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

 

wget ssl error 

Docker를 사용하다가 이따 금식 wget을 이용해 파일을 다운로드할 때 ssl error가 나는데 `--no-check-certificetion` 을 넣어 해결했습니다.

RUN wget --no-check-certificate https://www.mysqltutorial.org/wp-content/uploads/2018/03/mysqlsampledatabase.zip

 

docker-entrypoint-initdb.d?

wget으로 가져온 압축파일을 해제하고 단순히 아래 명령을 통해 docker-compose를 하게 되면 sql 파일의 내용이 반영이 안 됩니다

CMD ["/usr/bin/mysql -uroot -p1234 classicmodels < mysqlsampledatabase.sql"]

왜 안 되는 건지 찾지 못했지만. 다만 위 명령을 통해 의도하고자 했던 바를 가능하게 하는 것이 docker-entrypoint-initdb.d라는 디렉터리더군요. 구글링을 통해 해당 디렉터리는 Docker 컨테이너가 최초 실행 시 불러올 스크립트가 위치하는 공간이라는 사실을 알게 됐습니다. 

 

이후 다음과 같이 방법을 변경했습니다.

1. Project Root에 init-db.sh라는 파일을 생성하고 init-db.sh파일에 수행할 내용을 적어줍니다 (E.g, sql 파일을 db에 import 하는 명령을 넣어줍니다).

# init-db.sh
/usr/bin/mysql -uroot -p1234 classicmodels < /mysqlsampledatabase.sql
2. docker-entrypoint-initdb.d 는 디렉토리니까 Dockerfile은 간단하게 적습니다.
ADD init-db.sh /docker-entrypoint-initdb.d
이렇게 하면 스크립트 파일에 포함된 내용을 실행할 수 있게 됩니다

 

Dockerfile

위 내용을 기반으로 Dockerfile에 전체적인 내용은 다음과 같이 작성 후 사용했습니다.

FROM mysql:5.7

ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_DATABASE classicmodels

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
RUN apt update
RUN apt install -y wget unzip

RUN wget --no-check-certificate https://www.mysqltutorial.org/wp-content/uploads/2018/03/mysqlsampledatabase.zip

RUN unzip /mysqlsampledatabase.zip
RUN chmod 777 /mysqlsampledatabase.sql

WORKDIR /

ADD init-db.sh /docker-entrypoint-initdb.d

CMD ["mysqld"]

 

22년 7월 19일, 추가 내용

기존에 Dockerfile을 통해 사용하고 있는 MySQL 컨테이너가 갑자기 build에 실패했습니다. apt-key 부분에서 실패해서 키 서버에 등록된 공캐 키가 삭제된 건지 싶었는데 문제는 다른 곳에 있었네요. 위 Dockerfile에 기술 내용 그대로 이용하다가 다음과 같은 상황을 겪었습니다.

sudo docker-compose -f ./deployment/docker-compose.yml up
Building db
[+] Building 2.1s (6/12)
 => [internal] load build definition from Dockerfile                                                                                    0.0s
 => => transferring dockerfile: 1.11kB                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                       0.0s
 => => transferring context: 2B                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/mysql:5.7                                                                            1.9s
 => CACHED [1/9] FROM docker.io/library/mysql:5.7@sha256:bbe0e2b0a33ef5c3a983e490dcb3c1a42d623db1d5679e82f65cce3f32c8f254               0.0s
 => [internal] load build context                                                                                                       0.0s
 => => transferring context: 31B                                                                                                        0.0s
 => ERROR [2/9] RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D81920AF8F040134                                           0.2s
------
 > [2/9] RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D81920AF8F040134:
#5 0.179 /bin/sh: apt-key: command not found
------
executor failed running [/bin/sh -c apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D81920AF8F040134]: exit code: 127
ERROR: Service 'db' failed to build : Build failed
make: *** [build-db-with-log] Error 1

잘 읽어보니 apt-key 명령을 찾을 수 없다고 하네요

 

일단 Dockerhub로 가서 변경점이 없나 살펴보았습니다.. https://hub.docker.com/_/mysql 이 링크에서 Supported tags and repspective Dockerfile links 부분에 5.7이 붙어 있는 링크로 이동해서 사용하는 명령어를 읽어보니 redhat 기반으로 바뀐 듯싶네요

 

stackoverflow에도 누군가 비슷한 내용으로 글을 올린 링크를 찾을 수 있었습니다. 해결 방법은 간단했습니다.  apt-key명령은 debian 기반의 리눅스에서 동작하는 명령이므로 mysql 컨테이너를 아래와 같이 debian 기반의  컨테이너를 사용하도록 변경하면 됩니다.

FROM mysql:5.7-debian

이후 아래와 같이  apt-key 명령을 사용하는 부분을 삭제 처리해줘도 동작하는 걸 확인할 수 있었습니다.

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D81920AF8F040134




728x90
반응형