Я пытаюсь создать образ контейнера для функции Node.js Lambda. Мое базовое изображение такое:
FROM public.ecr.aws/lambda/nodejs:20
COPY index.js ${LAMBDA_TASK_ROOT}
CMD [ "index.handler" ]
Однако моя функция Node.js также использует пакет pdf2htmlEX. Один из способов установить его — с помощью apt-get. Запуск apt-get в приведенном выше файле докеров вернет ошибку «команда не найдена». Это понятно, потому что apt-get недоступен в образе Node.js от AWS.
Возможно, это не тот способ сделать это. В конечном итоге, как мне получить функцию Lambda Node.js для выполнения пакета Linux (в данном случае pdf2htmlEX)?
Обновление 1. После тестирования различных вариантов и комбинаций я создал альтернативный базовый образ для установки pdf2htmlEX, node.js и npm:
ARG FUNCTION_DIR = "/function"
FROM ubuntu:18.04
ARG FUNCTION_DIR
ENV NODE_VERSION=16.13.0
RUN apt-get update
COPY ./pdf2htmlEX.deb /tmp
# Install pdf2htmlEX and node.js and related packages
RUN apt-get install -y /tmp/pdf2htmlEX.deb curl cmake autoconf libtool
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH = "/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
RUN mkdir -p ${FUNCTION_DIR}
COPY index.js package.json ${FUNCTION_DIR}
WORKDIR ${FUNCTION_DIR}
RUN npm install aws-lambda-ric
CMD [ "index.handler" ]
Сборка не удалась при установке aws-lambda-ric, клиента интерфейса среды выполнения, необходимого при использовании альтернативного базового образа. Журнал ошибок слишком длинный, чтобы публиковать его здесь, поэтому, возможно, это не та конфигурация.
Обновление 2: Еще одна попытка использования node-20:buster:
ARG FUNCTION_DIR = "/function"
FROM node:20-buster as build-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
COPY ./pdf2htmlEX.deb /tmp
# Install build dependencies
RUN apt-get update && \
apt-get install -y \
/tmp/pdf2htmlEX.deb
Получил другой тип ошибки:
The following packages have unmet dependencies:
pdf2htmlex : Depends: libjpeg-turbo8 but it is not installable
Unable to correct problems, you have held broken packages.
@JRichardsz Однако этот инструмент предназначен для преобразования PDF в HTML. Это обеспечивает более точный контроль над онлайн-публикацией, в отличие от преобразования HTML в PDF. Это лучший инструмент с открытым исходным кодом для этой цели, который я могу найти. Есть еще рекомендации?





Образ Docker (public.ecr.aws/lambda/nodejs:20), который вы использовали, создан для Amazon Linux 2023 (AL2). Для установки любого пакета вы можете yum Однако dnf инструментом управления пакетами программного обеспечения по умолчанию в AL2023 является DNF. DNF является преемником YUM, инструмента управления пакетами в AL2.
DNF по своему использованию похож на YUM. Многие команды и параметры DNF такие же, как команды YUM. В команде интерфейса командной строки (CLI) в большинстве случаев dnf заменяет yum.
Например, для следующих команд AL2 yum:
$ sudo dnf install packagename
Добавление Run sudo dnf install <<package_name>> приводит к sudo: команда не найдена». Однако удаление sudo приводит к выводу «Ни один пакет не соответствует <<имя_пакета>>». Работает ли dnf вообще с образом node.js 20?
Там нет sudo. Просто используйте без sudo.
Я попробовал этот образ локально и в реальной учетной записи AWS.
Папка должна выглядеть так
Докерфайл
# Get a base image
FROM public.ecr.aws/ubuntu/ubuntu:22.04
# Set some defaults
ARG LAMBDA_TASK_ROOT = "/app"
ARG LAMBDA_RUNTIME_DIR = "/usr/local/bin"
ARG PLATFORM = "linux/amd64"
RUN groupadd --gid 1000 node; \
useradd --uid 1000 --gid node --shell /bin/bash --create-home node
# node
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION v20.13.0
RUN mkdir -p /usr/local/nvm && apt-get update && echo "y" | apt-get install curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"
ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/bin
ENV PATH $NODE_PATH:$PATH
WORKDIR /app
## Install aws-lambda-ric
RUN apt-get update; \
apt-get install -y \
g++ \
make \
cmake \
unzip \
libcurl4-openssl-dev \
autoconf \
automake \
build-essential \
libtool \
m4 \
python3 \
unzip \
libssl-dev; \
rm -rf /var/lib/apt/lists/*;
RUN npm install aws-lambda-ric -g
# Copy function code
COPY ./app/ ${LAMBDA_TASK_ROOT}/
RUN npm install
# Prevent this warn
# npm WARN logfile Error: ENOENT: no such file or directory, scandir '/home/sbx_user1051/.npm/_logs'
# https://stackoverflow.com/a/73394694/3957754
RUN mkdir -p /tmp/.npm/_logs
ENV npm_config_cache /tmp/.npm
# (Optional) Add Lambda Runtime Interface Emulator and use a script in the ENTRYPOINT for simpler local runs
WORKDIR ${LAMBDA_TASK_ROOT}
ADD "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" "/usr/bin/aws-lambda-rie"
COPY entry.sh /
RUN chmod 755 "/usr/bin/aws-lambda-rie" "/entry.sh"
## Install pdf2htmlEX
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update; \
apt-get -y install tzdata libjpeg-turbo8 wget gpg curl xz-utils jq libglib2.0-dev libcairo2-dev
RUN curl -s https://api.github.com/repos/pdf2htmlEX/pdf2htmlEX/releases/latest | jq -r '.assets[] | select(.name= = "pdf2htmlEX-0.18.8.rc1-master-20200630-Ubuntu-bionic-x86_64.deb").browser_download_url' | wget -qi - -O /tmp/pdf2htmlEX.deb
RUN dpkg -i /tmp/pdf2htmlEX.deb
RUN pdf2htmlEX -v
ENTRYPOINT [ "/entry.sh" ]
CMD [ "app.handler" ]
запись.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/bin/aws-lambda-rie npx aws-lambda-ric $1
else
exec npx aws-lambda-ric $1
fi
приложение.js
const exec = require('util').promisify(require('child_process').exec);
exports.handler = async (event, context) => {
let out = await exec(`pdf2htmlEX -v`).catch(e => e);
console.info("pdf2htmlEX command", JSON.stringify(out));
return {
statusCode: 200,
body: {
code: 200,
message: "Hell!!"
}
};
}
В качестве доказательства установки pdf2htmlEX я распечатал pdf2htmlEX -v
в локальном хосте
внутри контейнера
настоящий аккаунт AWS
Я публикую изображение, чтобы оно было готово к использованию.
https://hub.docker.com/repository/docker/jrichardsz/aws-lambda-nodejs/general
Большое спасибо, что нашли время для создания изображения.
Ваша проблема не в докере или лямбде. Это с pdf2htmlex. Я даже не могу установить его на новую ОС Ubuntu. Для преобразования HTML в PDF существует множество хорошо поддерживаемых инструментов.