STRAPI + MySQL를 docker compose로 띄우는 도중 생기는 오류 해결하기

STRAPI를 사용해 보려고 기본 세팅으로 시작해보니 sqlite를 기본 디비로 사용하고 있더군요. 간단한 기능은 이 디비로 가능하지만 제대로 하려면 역시 최소한 MySQL (MariaDB) 를 사용해야 합니다.

Dockerfile 및 docker compose 설정은 공식홈페이지의 https://docs.strapi.io/dev-docs/installation/docker 문서를 확인하시기 바랍니다.

이제 위 공식 사이트 설정대로 개발 환경을 구축하고 docker compose 실행하면 strapi 용 컨테이너가 다음과 같은 오류가 발생하고 계속 재시작됩니다. (오류를 보기위해 데몬화하는 -d 옵션을 빼고 실행시켰습니다.) 역시 쉽게 가는 법이 없네요. ㅜㅜ;

# docker compose up
strapi    | yarn run v1.22.19
strapi    | $ strapi develop
strapi    | Error: Could not load js config file /opt/app/node_modules/@strapi/plugin-upload/strapi-server.js: 
strapi    | Something went wrong installing the "sharp" module
strapi    | 
strapi    | Cannot find module '../build/Release/sharp-linuxmusl-x64.node'
strapi    | Require stack:
strapi    | - /opt/app/node_modules/sharp/lib/sharp.js
strapi    | - /opt/app/node_modules/sharp/lib/constructor.js
strapi    | - /opt/app/node_modules/sharp/lib/index.js
strapi    | - /opt/app/node_modules/@strapi/plugin-upload/server/services/image-manipulation.js
strapi    | - /opt/app/node_modules/@strapi/plugin-upload/server/services/index.js
strapi    | - /opt/app/node_modules/@strapi/plugin-upload/server/index.js
strapi    | - /opt/app/node_modules/@strapi/plugin-upload/strapi-server.js
strapi    | - /opt/app/node_modules/@strapi/utils/dist/import-default.js
strapi    | - /opt/app/node_modules/@strapi/utils/dist/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/utils/components.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/queries/entity.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/queries/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/providers/local-destination/strategies/restore/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/providers/local-destination/strategies/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/providers/local-destination/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/providers/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/strapi/index.js
strapi    | - /opt/app/node_modules/@strapi/data-transfer/dist/index.js
strapi    | - /opt/app/node_modules/@strapi/strapi/dist/commands/index.js
strapi    | - /opt/app/node_modules/@strapi/strapi/bin/strapi.js
strapi    | 
strapi    | Possible solutions:
strapi    | - Install with verbose logging and look for errors: "npm install --ignore-scripts=false --foreground-scripts --verbose sharp"
strapi    | - Install for the current linuxmusl-x64 runtime: "npm install --platform=linuxmusl --arch=x64 sharp"
strapi    | - Consult the installation documentation: https://sharp.pixelplumbing.com/install
strapi    |     at loadJsFile (/opt/app/node_modules/@strapi/strapi/dist/core/app-configuration/load-config-file.js:21:19)
strapi    |     at loadFile (/opt/app/node_modules/@strapi/strapi/dist/core/app-configuration/load-config-file.js:41:20)
strapi    |     at Object.loadPlugins (/opt/app/node_modules/@strapi/strapi/dist/core/loaders/plugins/index.js:93:62)
strapi    |     at async Strapi.loadPlugins (/opt/app/node_modules/@strapi/strapi/dist/Strapi.js:373:9)
strapi    |     at async Promise.all (index 3)
strapi    |     at async Strapi.register (/opt/app/node_modules/@strapi/strapi/dist/Strapi.js:407:9)
strapi    |     at async Strapi.load (/opt/app/node_modules/@strapi/strapi/dist/Strapi.js:493:9)
strapi    |     at async workerProcess (/opt/app/node_modules/@strapi/strapi/dist/commands/actions/develop/action.js:100:28)
strapi    |     at async exports.default (/opt/app/node_modules/@strapi/strapi/dist/commands/actions/develop/action.js:38:20)
strapi    | 
strapi    | Done in 3.25s.
strapi exited with code 0

구글링으로 검색해 봐도 여러 해결책을 알려주지만 제대로 되는 건 거의 없었습니다. sharp 모듈 관련해서 계속 오류가 난다고는 하지만 정확히는 그게 문제가 아니어서 해결책을 찾는데 시간이 많이 소요되었네요.

유일하게 Dockerfile 에 RUN npm install sharp@0.28.3 –save 내용을 넣으면 오류가 사라지긴 합니다만 이것도 제대로 된 해결책은 아니었습니다.

결론은 .dockerignore 파일을 아래와 같이 설정하고 strapi 프로젝트 폴더에 위치시켜야 합니다.

node_modules
npm-debug.log
yarn-error.log

이렇게 하면 Dockerfile 에서 COPY . . 하면서 소스를 복사할 때 node_modules 부분을 제외할 수 있습니다. 이러면 원래 Dockerfile 내에 yarn install 이 해당 환경에 맞는 모듈을 정확하게 가져온 것을 사용하므로 제대로 작동하고 docker compose build 도 더 빨리 실행됩니다.

이제 docker compse up 을 실행하면 제대로 오류 없이 실행될 겁니다. ^o^