apple / pkl

A configuration as code language with rich validation and tooling.
https://pkl-lang.org
Apache License 2.0
9.84k stars 259 forks source link

`pkl: Exec format error` in Dockerfile #517

Closed scariabpc closed 3 weeks ago

scariabpc commented 3 weeks ago

Hi, I'm trying to use pkl inside of my Dockerfile. Currently the Dockerfile has something like this:

# Use the official Python image from the Docker Hub
FROM python:3.11-slim

# Install pkl.
# https://github.com/apple/pkl/releases/tag/0.25.3
ARG PKL_BINARY=pkl-linux-amd64
RUN curl -L -o /opt/pkl https://github.com/apple/pkl/releases/download/0.25.3/${PKL_BINARY} \
  || { echo 'Failed to download pkl'; exit 1; }

# Ensure pkl is executable.
RUN chmod +x /opt/pkl

# Add pkl to the PATH.
ENV PATH="/opt:${PATH}"

...

When this image runs on AWS ECS with Linux, the pkl commands work, but when I build and run the image locally on my Mac with M2 chip I get this error.

$ docker build --build-arg PKL_BINARY=pkl-macos-amd64 -f .../Dockerfile -t my-app ./
$ docker run -p 3000:3000 my-app
sh: 1: pkl: Exec format error
HT154 commented 3 weeks ago

The binary you are using is pkl-linux-amd64, which is for linux systems running Intel/amd64/x86_64 architecture processors. The build arg you are providing (pkl-macos-aarch64 is for macOS systems running on ARM processors. To run in a linux container on ARM processors, you need to use the pkl-linux-aarch64 binary.

If you are building a multi-architecture container image then you can use the TARGETARCH arg to choose the right binary to download. See the Docker documentation on how to use this arg: https://docs.docker.com/build/guide/multi-platform/

bioball commented 3 weeks ago

Closing as this is not a Pkl problem (see @HT154's comments)