I am trying to build a container image for a Vue app. The Dockerfile
is very simple and contains a build, post checkout, and post build hook for the respective stages. post checkout runs successfully but for some reason I am having an error where the package.json
file is not being seen.
I tried running ls -al
to see the contents of the image right before the build command runs and here is the output:
0.496 drwxr-xr-x 1 root root 4096 Jul 22 13:58 .
0.496 drwxr-xr-x 1 root root 4096 Jul 22 13:58 ..
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 bin
0.496 drwxr-xr-x 2 root root 4096 Jun 19 21:20 boot
0.496 drwxr-xr-x 5 root root 340 Jul 22 13:58 dev
0.496 drwxr-xr-x 1 root root 4096 Jul 22 13:58 etc
0.496 drwxr-xr-x 1 root root 4096 Jul 9 16:49 home
0.496 drwxr-xr-x 8 root root 4096 Jul 1 00:00 lib
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 lib64
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 media
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 mnt
0.496 drwxr-xr-x 1 root root 4096 Jul 9 16:50 opt
0.496 dr-xr-xr-x 183 root root 0 Jul 22 13:58 proc
0.496 drwx------ 2 root root 4096 Jul 1 00:00 root
0.496 drwxr-xr-x 3 root root 4096 Jul 1 00:00 run
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 sbin
0.496 drwxr-xr-x 2 root root 4096 Jul 1 00:00 srv
0.496 dr-xr-xr-x 13 root root 0 Jul 22 13:58 sys
0.496 drwxrwxrwt 1 root root 4096 Jul 22 13:58 tmp
0.496 drwxr-xr-x 1 root root 4096 Jul 1 00:00 usr
0.496 drwxr-xr-x 1 root root 4096 Jul 1 00:00 var
I tried running ls -al
on /usr and saw it contained an src
directory so I ran ls -al
on it and got this:
0.465 drwxr-xr-x 2 root root 4096 Jun 19 21:20 .
0.465 drwxr-xr-x 1 root root 4096 Jul 1 00:00 ..
The Dockerfile in question is:
# base node image
FROM node:20-bullseye-slim as base
ARG NODE_ENV=staging
ARG DOTENV_KEY
ARG COMMIT_SHA
ARG RELEASE_SEMVER
# set for base and all layer that inherit from it
ENV LOG_LEVEL=debug
ENV DEBUG_API=true
ENV NODE_ENV ${NODE_ENV}
ENV DOTENV_KEY ${DOTENV_KEY}
ENV COMMIT_SHA ${COMMIT_SHA}
ENV RELEASE_SEMVER ${RELEASE_SEMVER}
RUN apt-get update && apt-get install -y curl tini
# Install all node_modules, including dev dependencies
FROM base as deps
WORKDIR /app
COPY package*.json ./
RUN npm install --include=dev
# Copy the rest of the application code
COPY . .
# Build the production image
FROM base as build
# WORKDIR /app
RUN ls -al /usr
ENV NODE_ENV staging
RUN npm run build
# Final image
FROM build as final
WORKDIR /app
EXPOSE 8080
CMD ["npm", "start"]
I’m admittedly extremely new to containerizing applications so I’ll appreciate any assistance you can give. The dockerfile is creating an image on the huub that our CI/CD then builds and runs
I tried running ls -al
a couple of times t see what structure the docker container sees and it soed not show the code in any of the steps before the failed build.
2
Answers
So it turns out I made a mistake and did not stack the layers correctly. I was using the base layer (where the package.json doesnt exist) instead of the deps layer that came before it and has all previous commands' output. fixed Dockerfile:
If you need package.json in order to run
npm run build
, then that stage, or the image that stage is based on, will need to be supplied it.In your case, package*.json has only been copied into the deps stage, not into the base or build stages.
If you move the following command into the base stage, then both deps and build stages will inherit the existence of the package*.json files:
As your CMD to run the app will also look for the NPM package files, this is likely what you want to do.