コンテナの構成
- Laravel
- Nuxt
- Nginx
- MySQL
現象
docker compose up -d --build
でビルドして起動するとNuxtのコンテナが起動しない。
コンテナのログを見てみると
/bin/sh: nuxt: not found
というエラーが出ていてスタートしていませんでした。
NuxtのDockerfile
FROM node:16-alpine
RUN mkdir -p /var/www/nuxt
# timezone
ARG TZ
WORKDIR /var/www/nuxt
COPY ./nuxt/ /var/www/nuxt/
RUN apk update
RUN apk upgrade
RUN apk add --no-cache make gcc g++
RUN yarn install
# EXPOSE 3000
ENTRYPOINT ["yarn", "run", "dev"]
docker-compose.yml
front-appがNuxtのコンテナです。
version: "3"
services:
web:
build:
context: .
dockerfile: ./docker/nginx/Dockerfile
args:
- TZ=${TZ}
volumes:
- ./docker/nginx/logs:/etc/nginx/logs
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ${PROJECT_PATH}:/var/www/laravel
ports:
- ${WEB_PORT}:80
links:
- app
depends_on:
- app
app:
build:
context: .
dockerfile: ./docker/php/Dockerfile
args:
- TZ=${TZ}
volumes:
- ${PROJECT_PATH}:/var/www/laravel
links:
- db_master
environment:
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=db_master
- DB_DATABASE=${DB_NAME}
- DB_USERNAME=${DB_USER}
- DB_PASSWORD=${DB_PASS}
- TZ=${TZ}
- MAIL_HOST=${MAIL_HOST}
- MAIL_PORT=${MAIL_PORT}
db_master:
image: mysql:5.7
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
- TZ=${TZ}
ports:
- ${DB_PORT}:3306
front_app:
build:
context: .
dockerfile: ./docker/node/Dockerfile
args:
- TZ=${TZ}
volumes:
- ./nuxt:/var/www/nuxt
ports:
- ${FRONT_PORT}:3001
links:
- web
depends_on:
- web
解決
docker-compose.ymlにvolumesを追加して、node_modulesをホスト側と切り離す。
以下のようにdocker-compose.ymlを修正しました。
version: "3"
services:
web:
build:
context: .
dockerfile: ./docker/nginx/Dockerfile
args:
- TZ=${TZ}
volumes:
- ./docker/nginx/logs:/etc/nginx/logs
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ${PROJECT_PATH}:/var/www/laravel
ports:
- ${WEB_PORT}:80
links:
- app
depends_on:
- app
app:
build:
context: .
dockerfile: ./docker/php/Dockerfile
args:
- TZ=${TZ}
volumes:
- ${PROJECT_PATH}:/var/www/laravel
links:
- db_master
environment:
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=db_master
- DB_DATABASE=${DB_NAME}
- DB_USERNAME=${DB_USER}
- DB_PASSWORD=${DB_PASS}
- TZ=${TZ}
- MAIL_HOST=${MAIL_HOST}
- MAIL_PORT=${MAIL_PORT}
db_master:
image: mysql:5.7
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
- TZ=${TZ}
ports:
- ${DB_PORT}:3306
front_app:
build:
context: .
dockerfile: ./docker/node/Dockerfile
args:
- TZ=${TZ}
volumes:
- ./nuxt:/var/www/nuxt
- node_modules_volume:/var/www/nuxt/node_modules // 追加
ports:
- ${FRONT_PORT}:3001
links:
- web
depends_on:
- web
volumes: // 追加
node_modules_volume: // 追加
「追加」と記載した3行を追加してビルドするとうまくいきました。
参考サイト