본문 바로가기

삽질

Docker 에러: Cannot create container for service : file exists

728x90

에러 발생

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

위의 명령어를 이용하여 임시로 컨테이너를 마운트하여 접근하였다. 삭제 말고도 같은 파일들을 복사해서 옮기는 방법으로도 해결가능할듯 하다. 

 

 

컨테이너 런타임 외에 마운트된 폴더는 건드리지 말자..

 

 

728x90