feat: use nix to build docker image

This commit is contained in:
Clansty 2023-01-14 17:19:58 +08:00
parent b3381fffe6
commit 6db646f933
4 changed files with 117 additions and 54 deletions

View File

@ -1,41 +0,0 @@
FROM jrottenberg/ffmpeg:4.1-alpine AS ffmpeg
FROM ghcr.io/clansty/tgs-to-gif:latest AS tgs
FROM node:17-alpine AS deps
WORKDIR /app
COPY package.json yarn.lock .yarnrc.yml ./
COPY .yarn/ ./.yarn/
RUN apk add --no-cache alpine-sdk python3 &&\
yarn install
RUN rm -rf ./.yarn/cache
FROM node:17-alpine AS build
WORKDIR /app
COPY --from=deps /app/ /app/
COPY tsconfig.json ./
COPY src/ ./src/
RUN yarn build
FROM node:17-alpine
WORKDIR /app
COPY --from=ffmpeg / /
COPY --from=tgs / /
COPY --from=deps /app/ /app/
COPY prisma/ ./prisma/
COPY assets/ ./assets/
COPY --from=build /app/build/ /app/build/
RUN yarn add prisma@4.6.0
CMD [ "yarn", "start" ]

52
docker.nix Normal file
View File

@ -0,0 +1,52 @@
{ pkgs, flakePkgs, nix2container, ... }:
nix2container.buildImage {
name = "q2tg";
maxLayers = 8;
# optimizations
layers = with pkgs;[
(nix2container.buildLayer { deps = [ bash ]; })
(nix2container.buildLayer { deps = [ nodejs ]; })
# deps of sharp
(nix2container.buildLayer {
deps = [
(vips.override {
libjxl = libjxl.overrideAttrs (attrs: {
doCheck = false;
});
}).dev
];
})
# deps of node-canvas
(nix2container.buildLayer { deps = [ pixman cairo.dev pango.dev giflib libjpeg.dev libpng.dev librsvg.dev ]; })
(nix2container.buildLayer { deps = [ ffmpeg ]; })
(nix2container.buildLayer { deps = with flakePkgs;[ prisma-patched prisma-engines tgs-to-gif ]; })
(nix2container.buildLayer { deps = with flakePkgs;[ fontsSf ]; })
];
config = {
Cmd = [
(
pkgs.writeScript "start" ''
#!${pkgs.bash}/bin/bash
${pkgs.coreutils}/bin/mkdir -p /tmp /root/.cache
${flakePkgs.prisma-patched}/bin/prisma db push --accept-data-loss --skip-generate --schema ${flakePkgs.default}/libexec/q2tg/node_modules/.prisma/client/schema.prisma
${flakePkgs.default}/bin/q2tg
''
)
];
Env = [
"DATA_DIR=/app/data"
"PRISMA_MIGRATION_ENGINE_BINARY=${pkgs.prisma-engines}/bin/migration-engine"
"PRISMA_QUERY_ENGINE_BINARY=${pkgs.prisma-engines}/bin/query-engine"
"PRISMA_QUERY_ENGINE_LIBRARY=${pkgs.prisma-engines}/lib/libquery_engine.node"
"PRISMA_INTROSPECTION_ENGINE_BINARY=${pkgs.prisma-engines}/bin/introspection-engine"
"PRISMA_FMT_BINARY=${pkgs.prisma-engines}/bin/prisma-fmt"
"TGS_TO_GIF=${flakePkgs.tgs-to-gif}/bin/tgs-to-gif"
"FFMPEG_PATH=${pkgs.ffmpeg}/bin/ffmpeg"
"FFPROBE_PATH=${pkgs.ffmpeg}/bin/ffprobe"
"QUOTLY_FONTS=${flakePkgs.fontsSf}"
];
Volumes = {
"/app/data" = { };
};
};
}

View File

@ -15,7 +15,56 @@
"type": "github"
}
},
"flake-utils_2": {
"locked": {
"lastModified": 1653893745,
"narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nix2container": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1671269339,
"narHash": "sha256-KR2SXh4c2Y+bgbCfXjTGJ74O9/u4CAPFA0KYZHhKf5Q=",
"owner": "nlewo",
"repo": "nix2container",
"rev": "6800fff45afecc7e47c334d14cf2b2f4f25601a0",
"type": "github"
},
"original": {
"owner": "nlewo",
"repo": "nix2container",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1654807842,
"narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fc909087cc3386955f21b4665731dbdaceefb1d8",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1671752829,
"narHash": "sha256-oFeJzAq0iRL6md9Si8Tx9bltjwjLmldvgUmAteMhYW4=",
@ -34,7 +83,8 @@
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
"nix2container": "nix2container",
"nixpkgs": "nixpkgs_2"
}
}
},

View File

@ -4,25 +4,27 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11";
flake-utils.url = "github:numtide/flake-utils";
nix2container.url = "github:nlewo/nix2container";
};
outputs = { self, nixpkgs, flake-utils }:
{
packages = nixpkgs.lib.mapAttrs
(system: pkgs: {
default = import ./default.nix { inherit pkgs; };
tgs-to-gif = pkgs.callPackage "${import ./nixos/clansty-flake.nix}/packages/tgs-to-gif" { };
prisma-patched = pkgs.callPackage ./nixos/prismaPatched.nix { };
fontsSf = pkgs.callPackage ./nixos/fontsSf.nix { };
})
nixpkgs.legacyPackages;
nixosModules.default = import ./nixos/module.nix { inherit self; };
} // flake-utils.lib.eachDefaultSystem
outputs = { self, nixpkgs, flake-utils, nix2container }:
flake-utils.lib.eachDefaultSystem
(system:
let
pkgs = nixpkgs.legacyPackages.${system};
flakePkgs = self.packages.${system};
nix2containerPkgs = nix2container.packages.${system};
in
{
packages = {
default = import ./default.nix { inherit pkgs; };
tgs-to-gif = pkgs.callPackage "${import ./nixos/clansty-flake.nix}/packages/tgs-to-gif" { };
prisma-patched = pkgs.callPackage ./nixos/prismaPatched.nix { };
fontsSf = pkgs.callPackage ./nixos/fontsSf.nix { };
docker = import ./docker.nix {
inherit pkgs flakePkgs;
nix2container = nix2containerPkgs.nix2container;
};
};
devShells.default = import ./shell.nix { inherit pkgs flakePkgs; };
}
);