Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FrankenPHP do no build binary with embed php app #748

Closed
grandrr opened this issue Apr 25, 2024 · 3 comments
Closed

FrankenPHP do no build binary with embed php app #748

grandrr opened this issue Apr 25, 2024 · 3 comments
Labels
bug Something isn't working

Comments

@grandrr
Copy link

grandrr commented Apr 25, 2024

What happened?

So i had try build binary with embed php app, build finish successfully but binary do not include embed php app, or i dont know how to build/use it.

When i had try use dockerfile as described here:
https://frankenphp.dev/docs/embed/#creating-a-linux-binary
I got error that this is not git folder, after some digging in issues described here i realise that i should add this line:
FRANKENPHP_VERSION=1.1.2
as result my Dockerfile starting looks like:

FROM --platform=linux/amd64 dunglas/frankenphp:static-builder

# Copy your app
WORKDIR /go/src/app/dist/app
COPY . .

# Build the static binary, be sure to select only the PHP extensions you want
WORKDIR /go/src/app/
RUN FRANKENPHP_VERSION=1.1.2 \
    EMBED=dist/app/ \
    PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \
    ./build-static.sh

So I had try build container by command:
docker build -t static-app -f static-build.Dockerfile .

This time its build successfully.

After i had try run command for build binary its stuck for some reason. So i remove all section related to run command for build binary, Dockerfile start looks like:

FROM --platform=linux/amd64 dunglas/frankenphp:static-builder

# Copy your app
WORKDIR /go/src/app/dist/app
COPY . .

# Build the static binary, be sure to select only the PHP extensions you want
WORKDIR /go/src/app/

I had build one more time, go inside container and run command inside container.

Run container by command:
docker run -it -p 127.0.0.1:80:80 static-app

after i get inside container in to folder:
/go/src/app as described in Dockerfile

And in this folder i run command for build binary like this:
FRANKENPHP_VERSION=1.1.2 EMBED=dist/app/ PHP_EXTENSIONS=ctype,iconv,pdo_sqlite ./build-static.sh

As result i get binary file, so i had run it like this:
./dist/frankenphp-linux-x86_64 php-server -v

its executed fine, but after i had try hit in browser:
http://127.0.0.1/
I got no response, and logs like this:

2024/04/25 17:50:59.925	DEBUG	http.handlers.file_server	sanitized path join	{"site_root": ".", "request_path": "/", "result": "."}
2024/04/25 17:50:59.926	DEBUG	http.handlers.file_server	no index file in directory	{"path": ".", "index_filenames": ["index.html", "index.txt"]}
2024/04/25 17:50:59.926	DEBUG	http.log.error	{id=7fu9petbc} fileserver.(*FileServer).notFound (staticfiles.go:629): HTTP 404	{"request": {"remote_ip": "172.17.0.1", "remote_port": "60084", "client_ip": "172.17.0.1", "proto": "HTTP/1.1", "method": "GET", "host": "127.0.0.1", "uri": "/", "headers": {"Sec-Ch-Ua-Platform": ["\"macOS\""], "Sec-Fetch-Mode": ["navigate"], "Sec-Fetch-Dest": ["document"], "Accept-Encoding": ["gzip, deflate, br, zstd"], "Accept-Language": ["en-GB,en-US;q=0.9,en;q=0.8,uk;q=0.7"], "Connection": ["keep-alive"], "Sec-Ch-Ua-Mobile": ["?0"], "Accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"], "User-Agent": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"], "Sec-Fetch-Site": ["none"], "Sec-Fetch-User": ["?1"], "Cache-Control": ["max-age=0"], "Sec-Ch-Ua": ["\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\""], "Upgrade-Insecure-Requests": ["1"]}}, "duration": 0.0004179, "status": 404, "err_id": "7fu9petbc", "err_trace": "fileserver.(*FileServer).notFound (staticfiles.go:629)"}

So i had try run this one:
http://127.0.0.1/index.php
and got response in browser:

Warning: Unknown: Failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Failed opening required '/go/src/app/index.php' (include_path='.:') in Unknown on line 0

So this is mean its looking for files in same root as binary is located, so as there is index.php copied from my local machine by command in Dockerfile i had try run it by url:
http://127.0.0.1/dist/app/index.php

and got response from my php file.

and my project:
Screenshot 2024-04-25 at 19 57 16

Build Type

Docker (Debian Bookworm)

Worker Mode

Yes

Operating System

GNU/Linux

CPU Architecture

x86_64

PHP configuration

franken

Relevant log output

No response

@grandrr grandrr added the bug Something isn't working label Apr 25, 2024
@KTanAug21
Copy link

Hello @grandrr! Instead of

RUN FRANKENPHP_VERSION=1.1.2 \
    EMBED=dist/app/ \
    PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \
    ./build-static.sh

Can you instead run the EMBED command first, like this:

RUN EMBED=dist/app/ \
    FRANKENPHP_VERSION=1.1.2 \
    PHP_EXTENSIONS=... \
    ./build-static.sh

I'm working on a Dockerfile generator for Laravel apps( fly-apps/dockerfile-laravel ) And I've recently added support to generate a Dockerfile that uses FrankenPHP to build a standalone binary( and get it deployable at Fly.io )! In my journey I've also experienced a similar misconception about running EMBED incorrectly as I've mentioned in a post. See items under ( NOTE! ).

I think that running EMBED first before declaring FRANKENPHP_VERSION should proceed with proper binary generation. ( although it took some time for the build to finish ). And once the build finishes, and you run ./dist/frankenphp-linux-x86_64 php-server , you should be able to see a log like:

embedded PHP app 📦     {"path": "/tmp/frankenphp_a204c16a3cc7597030296b259d908317  app.tar"}

That should be your sign that the app has been embedded successfully!

@grandrr
Copy link
Author

grandrr commented Apr 30, 2024

Thanks KTanAug21, i will try!

@grandrr
Copy link
Author

grandrr commented Apr 30, 2024

Thanks one more time! its working! i got this log:
embedded PHP app 📦 {"path": "/tmp/frankenphp_d5058167b13bd154646861207bd8944c app.tar"}
and it give me response from index.php in public folder, next try will be with real project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants