Docker 에러: Cannot create container for service : file exists
에러 발생
Creating srcs_mariadb_1 ... error
Creating srcs_adminer_1 ...
ERROR: for srcs_mariadb_1 Cannot create container for service mariadb: failed to mkdir /var/lib/docker/volumes/srcs_db-data/_data/mysql: mkdir /var/lib/dockerCreating srcs_adminer_1 ... done
ERROR: for mariadb Cannot create container for service mariadb: failed to mkdir /var/lib/docker/volumes/srcs_db-data/_data/mysql: mkdir /var/lib/docker/volumes/srcs_db-data/_data/mysql: file exists
ERROR: Encountered errors while bringing up the project.
make: *** [up] Error 1
문제 발생 상황 및 재연
당시 사용한 docker-compose.yaml 파일
version: '3.2'
volumes:
db-data:
driver: local
driver_opts:
type: none
device: ${HOME}/data/db/
o: bind
services:
mariadb:
build:
context: requirements/mariadb/.
dockerfile: Dockerfile
image: mariadb:${TAG}
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${WORDPRESS_DB_NAME}
MYSQL_USER: ${WORDPRESS_DB_USER}
MYSQL_PASSWORD: ${WORDPRESS_DB_PASSWORD}
expose:
- "3306"
volumes:
- db-data:/var/lib/mysql
- 문제가 발생한 docker-compose.yaml 파일
문제 발생 재연
컨테이너가 꺼진 상태에서 host 컴퓨터에서 bind 된 폴더의 내용을 삭제하고, 다시 컨테이너를 실행시켰을때 발생
1. docker-compose up —build로 컨테이너를 시작.
2. 컨테이너 종료하기
3. 종료 이후 rm -rf ${HOME}/data/db/* 로 bind되었던 폴더 삭제
4. docker-compose up 다시 컨테이너 시작
5. 에러 발생
해결방법
문제가 되는 볼륨 내부를 삭제하는 방법으로 해결할 수 있다.
1. 먼저 모든 컨테이너 종료한다.
2. docker volume ls 로 문제가 된 볼륨 이름을 확인한다.
$ docker volume ls
DRIVER VOLUME NAME
local srcs_db-data
2. 임시로 컨테이너에 볼륨을 마운트 한다.
$ docker run --rm -it -v srcs_db-data:/docker alpine:edge
3. 볼륨 마운트 된 내부를 삭제한다.
$ rm -rf docker/*
4. docker-compose up 으로 에러가 발생했던 서비스를 다시 시작한다.
추가 설명
/var/lib/docker/volumes/srcs_db-data/ 경로는 도커가 사용하는 볼륨 폴더 경로이다.
실제로 저 문제가 되는 폴더를 호스트에서 접근하려고 하였으나 실패하였다.
해당 폴더는 MAC OS에서 직접 호스트로 접근할 수 없다. 찾아보니 맥에서는 도커에서 별도로 vm을 사용해서 마운트 되어 있다고 한다.
docker run --rm -it -v srcs_db-data:/docker alpine:edge
위의 명령어를 이용하여 임시로 컨테이너를 마운트하여 접근하였다. 삭제 말고도 같은 파일들을 복사해서 옮기는 방법으로도 해결가능할듯 하다.
컨테이너 런타임 외에 마운트된 폴더는 건드리지 말자..