denoland / deno_docker

Latest dockerfiles and images for Deno - alpine, centos, debian, ubuntu
https://hub.docker.com/r/denoland/deno
MIT License
917 stars 101 forks source link

Add multi-stage docker image for alpine without glibc #5

Open hayd opened 5 years ago

hayd commented 5 years ago

You have to first build gn using ubuntu then build deno with gn in alpine. This should be possible, and I have some progress towards it... (failing) attempt: Dockerfile. failure output

~This may also be useful for automating creating of binaries suitable for AWS Lambda (or similar). The tricky part is to not rely on glibc...~ This is complete.

Note/Aside: Current size is 62Mb (18.1Mb compressed).

See also https://github.com/denoland/deno/issues/1456 ~and https://dev.to/kt3k/write-aws-lambda-function-in-deno-4b20~.

xpost: https://github.com/denoland/deno/issues/3243

webdeb commented 3 years ago

Not exactly sure how this is related, but I am running a multi-stage build by running deno bundle app.ts app.bundle.js in the first stage and then copying the produced file into the final image. Works nice! This is a just a simple events handler and the size of the app.bundle.js is about 450kb.

hayd commented 3 years ago

@webdeb An example like that would be really nice for the README, I think that's a better option that running bundle locally (on potentially another deno version) then using that file :+1:

webdeb commented 3 years ago

@hayd sure!

Please feel free to include it, I just copied what I have locally in my project (just updated it according to the new release):

FROM hayd/alpine-deno:1.5.2 as build
ADD . .
RUN deno bundle --importmap=./import_map.json --unstable ./app.ts /tmp/app.bundle.js

# --- build the final image, include only the app.bundle.js
FROM hayd/alpine-deno:1.5.2
WORKDIR /app
USER deno
ENV MODE=production

COPY --from=build /tmp/app.bundle.js /app/app.bundle.js
CMD ["deno", "run", "--allow-net", "--allow-env", "--allow-read", "/app/app.bundle.js"]
CanRau commented 3 years ago

@webdeb Why use bundle and not compile?

Trying to "improve" my Dockerfile though both of those produce the same error, which I not get running the server using deno run

The bundle'd at least show a more insightful error & lets me inspect

error: Uncaught ReferenceError: Cannot access 'Error' before initialization
class DenoStdInternalError extends Error {

Thoug I've no idea what to do, probably opening a new issue @ denoland/deno right?

webdeb commented 3 years ago

@CanRau Oh your are right. I guess by that time the compile command wasn't available. Your error seems weird and reporting it is a good idea, however to fix workaround your problem maybe you could try to define a Variable like const ExtendableError = Error and then use it like MyError extend ExtendableError {} Don't know if this will work, but it could ;)

CanRau commented 3 years ago

Huh, just found https://github.com/denoland/deno/issues/12086 and it's "duplicate" https://github.com/denoland/deno/issues/12477

@webdeb I'm not directly using Error in my code, at least as far as I recall