개요
시도하고자 했던 것은 테스트에 필요한 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
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
'ETC > Dockerizing' 카테고리의 다른 글
[Docker] Docker에서 MySQL 사용 시 참고할 부분들 (0) | 2023.08.20 |
---|---|
[Docker]CentOS로 systemctl 사용하기 (0) | 2022.02.08 |
[Docker] Docker에 관련된 여러가지 삽질 (0) | 2021.02.11 |