본문 바로가기

공부기록/Backend

[docker] 백엔드 docker-compose 파일 build 에러 디버깅해보기 2

  • 에러상황 
  • 구현하고자 했던 것 
  • 성공적으로 완료하면
  • 디버깅 방법 1. 
  • 문제 1. env파일에 작성한 환경변수 잘 불러와지는가? 
  • 문제 2. docker-compose up했을 때 build가 되지 않음
  • 문제 3. 각각의 옵션을 잘 알지 못하며 무엇을 빼놓았는지 알지 못함
  • 에러상황 해결
  • 아직 해결 하지 못한 에러 

 

에러상황 : docker-compose 파일을 활용해 build를 하면

container를 생성하지 못함 

 

 

 

구현하고자 했던 것 

node와 mysql의 연동을 위해 docker-compose파일을 활용하여 build에 성공 하기

 

성공적으로 완료하면

 

docker-compose up 

 

container가 잘 생성되고, run을 했을 때 5001포트가 잘 실행될 것임

 

 

문제 1. env파일에 작성한 환경변수 잘 불러와지는가?


 

  1. 쉘 환경변수
  2. 환경변수 파일
  3. Dockerfile에 환경변수 직접 삽입

방법이 위와 같으므로 .env파일 활용 가능

 

https://seongjin.me/environment-variables-in-docker-compose/

 

Docker Compose에서 각 서비스 컨테이너에 쓰이는 환경변수를 다루는 방법

도커 컴포즈(Docker Compose)를 사용할 때 각 서비스 컨테이너에 필요한 환경변수들을 어떻게 하면 효율적으로 다룰 수 있을까? 이번 글에서는 도커 컴포즈(Docker Compose)에서 환경변수를 다루는 방법

seongjin.me

 

 

문제 2. docker-compose up했을 때 build가 되지 않음


build가 되고 있지 않은 사진

 

 

docker-compose up 명령어는

컨테이너 생성/시작 옵션이므로 

만일 정상적으로 이루어 지려면 building이 된다고 떠야 할 것임 

 

그러나 build가 되고 있지 않았음 

 

 

build가 되지 않는 이유 :

 

build옵션을 주지 않았음 :  build옵션 설정 완료 

 

그래도 build가 이루어지지 않았음 :

현재 나는 mysql을 docker container로 생성하여 데이터를 보존하기 위해 

volume옵션을 생성하고 있었는데 그것 때문일 수 있다는 글을 보고 volume을 삭제

 

 

docker-compose up doesn't rebuild image although Dockerfile has changed · Issue #1487 · docker/compose

Very often, docker-compose up doesn't rebuild image specified as "build:" in the docker-compose.yml although the respective Dockerfile has changed. Instead, I need to run docker build -t servicenam...

github.com

 

정상적으로 build에 성공 ...!

 

정상적인 build 될 때의 안내 문구 사진

 

 

문제 3. 각각의 옵션을 잘 알지 못하며 무엇을 빼놓았는지 알지 못함 :

docker-compose 파일의 옵션 (공식문서는 너무 많으므로 블로그참고)을 참고하여

각각의 속성 파악 및 없는 속성 추가해보기

 

docker-compose 파일

version: "3.7"
services:
  app:
    image: node:20-alpine
    # command: sh -c "npm install && npm start" => 에러 나므로 삭제 
    build: . #build옵션 지정 Dockerfile사용해서 build 해야하므로 현재 경로 지정 
    ports:
      - 5001:5001
    depends_on:
      - mysql
    environment:
      MYSQL_HOST: mysql
      MYSQL_DB: mysql-container
      MYSQL_ROOT_USER: ${DB_USER}
      MYSQL_ROOT_PASSWORD: ${DOCKERMYSQL_PASSWORD}
    volumes:
      - refrigerator-mysql-data:/usr/src/app
    networks:
      - refrigeratornetwork
  mysql:
    image: mysql:8
    platform: linux/arm64
    ports:
      - 3306:3306
    volumes:
      - refrigerator-mysql-data:/usr/src/mysql
    environment:
      MYSQL_ROOT_USER: ${DB_USER}
      MYSQL_ROOT_PASSWORD: ${DOCKERMYSQL_PASSWORD}
      MYSQL_DATABASE: mysql-container
    networks:
      - refrigeratornetwork
volumes:
  refrigerator-mysql-data:
networks:
  refrigeratornetwork:
    driver: bridge #external옵션에서 변경. 직접 설정하지 않고 자동으로 생성해줄 수 있게됨

 

 

1. version : 정보를 위함이며 compose는 이걸 사용하지 않는다.

2. name: project name으로 사용됨. 환경변수로도 사용됨 (COMPOSE_PROJECT_NAME)

3. services: 컨테이너를 실행하기 위해 정의 

4. container name : services내부에 컨테이너의 이름 지정 

5. image: 컨테이너에 사용될 이미지 

6. build: Dockerfile 빌드하기 위해 Dockerfile이 있는 경로 지정 

7. restart : no(수동), always(컨테이너 수동으로 끄기전까지 재시작), on-failure(오류있을시 재시작)

8. environment : 환경변수 설정

9. volumes: 지정한 경로의 볼륨 마운트 

10. depends_on : services간 종속 설정 

11. expose : 컨테이너간 통신할 때는 컨테이너 내부에만 공개하는 공개 포트 지정

 

 

 

 

Docker-compose.yml 구성 요소 사용법

Docker compose 파일에서 사용되는 모듈에 대해서 확인 해보도록 하겠습니다.

medium.com

 

expose : 컨테이너간 통신할때 

 

[Docker] Docker Compose ports/expose(컨테이너 간 통신)

컨테이너 간 통신(ports/expose) Docker Compose에서 컨테이너가 공개하는 포트는 ports로 지정합니다. '호스트 머신의 포트 번호:컨테이너의 포트 번호'를 지정하거나, 컨테이너의 포트번호만 지정합니

kimjingo.tistory.com

 

 

에러상황 해결:   

docker-compose 파일을 활용해 build를 해도

container를 생성하지 못함 

 

해결 완료되어 컨테이너는 아래와 같이 정상적으로 생성하게 됨

 

 

 

 

문제 4. Error response from daemon: network refrigeratornetwork not found :

 

 

해결 : 

networks 설정이 잘못 된 것일 것같아 설정을 external에서 driver bridge로 변경해봄

 

 

 

아직 해결 하지 못한 에러 : Error connecting to database ConnectionRefuseError

 

 

 

이것은 다음글에서