Closed simplenotezy closed 2 years ago
Did you see https://sharp.pixelplumbing.com/install#cross-platform ?
If the runtime environment is musl-based Linux (e.g. Alpine) but the install time environment is glibc-based Linux (e.g. Debian), you'll need to pass --platform=linuxmusl
at npm install
time.
Thanks for a prompt reply. Yes I did see that part; I've been trying to debug the issue for some time now.
I also did read some counter messages since, who claimed that as long as you used an image such as bullseye or buster it would work out of the box.
I tried configuring my Dockerfile
like so:
FROM --platform=linux/amd64 node:16-bullseye-slim
RUN npm install --platform=linuxmusl
Make sure you're not populating/copying the node_modules
directory from anywhere else - watch out for volumes etc.
@lovell thanks, already checked that though. I also tried completly removing node_modules before building, just to verify. In my docker-compose I do like this:
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
After tinkering a bit more around, I've managed to get it working with below.
Instead of simply doing:
FROM node:16-bullseye-slim AS development
COPY package*.json ./
RUN npm install
RUN npm install --arch=arm64 --platform=linuxmusl sharp
COPY . .
RUN npm run build
I add another stage like so:
# development builder
FROM node:16-bullseye-slim AS development
COPY package*.json ./
RUN npm install
RUN npm install --arch=arm64 --platform=linuxmusl sharp
COPY . .
RUN npm run build
# development runner (ARM/M1 compatible)
FROM --platform=linux/amd64 node:16-bullseye AS runner
COPY --from=development . .
WORKDIR /usr/src/app
This allows for fast builds (building with FROM --platform=linux/amd64
is terribly slow) as well as ensuring that the "runner" will run in linux/amd64
Then in my docker-compose.yaml
I ensure target
is runner
instead of development
:
build:
context: .
target: runner
dockerfile: ./Dockerfile
Glad to hear your worked it out for what is a relatively advanced build process, where node_modules
is being copied between platforms.
For anyone else coming here, the underlying advice for mixing different flavours of Linux remains the same and applies to all native modules, not just sharp - make sure the libc being used at runtime matches that declared at install time.
This command worked for me :
RUN npm install --arch=arm64 --platform=linuxmusl sharp
This fixed my problem #2460 better and elegantly than any other solution proposed here but my case was not entirely similar to the initial problem posted here
So many people are reporting this issue yet no fix in sight. I've seen like 10 report of it and the fix is like one line of documentation.
BTW the solution is
npm install --force @img/sharp-linux-x64
@s1nistr4 This issue relates to versions of sharp prior to v0.33.0. In your case, where you are using v0.33.0+, you opened https://github.com/lovell/sharp/issues/4021 but did not provide the requested information that would have allowed me to help you.
The "fix" you describe is a temporary workaround that I do not recommend. I suspect you've run into https://github.com/npm/cli/issues/4828. There is a link to this known npm bug in the sharp documentation.
I'm going to lock this issue as it does not help people using the latest version.
Problem.
When running sharp inside a docker image using
FROM node:16-bullseye-slim
it works as expected.However, other parts of my application (e.g. the mongo-memory-server) requires me to do:
FROM --platform=linux/amd64 node:16-bullseye-slim AS development
- because I am on an M1 Arm machine.When this platform is added, sharp no longer works, and fails with:
I notice it's trying to look for
../build/Release/sharp-linux-arm64v8.node
however, the only release file that's inside that folder is:sharp-linuxmusl-arm64v8.node
Possible install-time or require-time problem
npm install
is the same as the architecture and platform of Node.js used at runtime.Are you using the latest version of sharp?
sharp
as reported bynpm view sharp dist-tags.latest
.What is the complete output of running
npm install --verbose sharp
?What is the output of running
npx envinfo --binaries --system --npmPackages=sharp --npmGlobalPackages=sharp
?