使用 Alpine - Unhandled 'error' 事件部署 Azure Function
Deploy Azure Function with an Alpine - Unhandled 'error' event
我想从最轻的 DockerFile 部署 Azure 功能(节点 and/or python)。
所以我需要能够 运行 az login
和 func
.
目前唯一运行良好的是 2.27GB。
我用 alpines 尝试了很多可能性,但调用 func
总是失败。
示例:
-
- [失败] Alpine Latest - 从 pip 安装 CLI 并从 NPM 安装 func (1.36GB)
FROM alpine:latest
RUN \
apk update && \
apk add bash make py3-pip && \
apk add --virtual=build gcc libffi-dev musl-dev openssl-dev python3-dev make && \
pip3 --no-cache-dir install -U pip && \
pip3 install azure-cli && \
apk del --purge build
RUN apk add --update nodejs nodejs-npm && \
npm i -g azure-functions-core-tools@latest --unsafe-perm true
当我调用 func -h
时出现错误:
events.js:291
throw er; // Unhandled 'error' event
^
Error: spawn /usr/local/lib/node_modules/azure-functions-core-tools/bin/func ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19)
at onErrorNT (internal/child_process.js:470:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:274:12)
at onErrorNT (internal/child_process.js:470:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'spawn /usr/local/lib/node_modules/azure-functions-core-tools/bin/func',
path: '/usr/local/lib/node_modules/azure-functions-core-tools/bin/func',
spawnargs: [ '-h' ]
}
-
- [失败] 节点(12 或 14)alpine - 从 pip 安装 CLI,从 NPM 安装 func (1.55GB)
FROM node:12-alpine # or 14-alpine
RUN \
apk update && \
apk add bash make py3-pip && \
apk add --virtual=build gcc libffi-dev musl-dev openssl-dev python3-dev make && \
pip3 --no-cache-dir install -U pip && \
pip3 install azure-cli && \
apk del --purge build
RUN npm i -g azure-functions-core-tools@3 --unsafe-perm true
与 alpine 相同的错误
-
- [成功]node:12/apt安装(2.27GB):
FROM node:12
# Install base dependencies
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y -q --no-install-recommends \
curl \
lsb-release \
apt-transport-https \
gnupg \
ssh \
&& apt-get clean
# Install azure function
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \
&& mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg \
&& sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list' \
&& sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/debian/$(lsb_release -rs | cut -d'.' -f 1)/prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
#Install Azure CLI
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
RUN AZ_REPO=$(lsb_release -cs) && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list
RUN apt-get update \
&& apt-get install -y azure-functions-core-tools \
&& apt-get install azure-cli
最新的 azure-cli
docker image 是用 Alpine 构建的。
不幸的是,我无法在 Alpine 上也 运行 azure-functions-core-tools
...(参见 https://github.com/Azure/azure-functions-core-tools/issues/1358)
但是,我设法从 ubuntu:20.04
开始制作了一个稍微“小”的图像
大小1.77GB,运行ning在GitlabCI没有问题(镜像也发布在我们的Gitlab中,所以pull还是蛮快的)
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.gpg
RUN AZ_REPO=$(lsb_release -cs) && \
echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list && \
echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$AZ_REPO-prod $AZ_REPO main" | tee /etc/apt/sources.list.d/dotnetdev.list
RUN apt-get update && apt-get install -y azure-cli azure-functions-core-tools-3
RUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash && apt-get install -y nodejs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
对于任何试图使其不受大小影响的人,这里有一个使用官方 Microsoft 图像的解决方案,最终为 2.81 GB。基于 this issue comment 我能够让它工作。但是,它需要一些修改。这是我最终得到的结果:
# Dockerfile
FROM mcr.microsoft.com/azure-functions/python:2.0.12493-python3.6-buildenv
# Install azure-cli
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install azure-cli
# Install azure-functions-core-tools
RUN apt-get install -y build-essential
RUN apt-get install -y gcc musl-dev python3-dev libffi-dev libssl-dev cargo
RUN apt-get update && apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.gpg
RUN AZ_REPO=$(lsb_release -cs) && \
RUN echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list && \
RUN echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$AZ_REPO-prod $AZ_REPO main" | tee /etc/apt/sources.list.d/dotnetdev.list
RUN apt-get update && apt-get install -y azure-functions-core-tools-3
您可以直接在本地使用它,但我需要它用于 GitLab CI 管道。所以首先你需要构建镜像并将其推送到 GitLab 容器存储库:
docker build -t registry.gitlab.com/GROUP/PROJECT/REPO/container-name .
docker push registry.gitlab.com/GROUP/PROJECT/REPO/container-name:latest
最后在 GitLab CI 管道中使用它:
# .gitlab-ci.yml
deploy:
image: registry.gitlab.com/GROUP/PROJECT/REPO/container-name:latest
stage: deploy
tags:
- dockerbuild-machine
script:
- pip3 install --target=".python_packages/lib/python3.8/site-packages" -r requirements.txt
- az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID
- az account set --subscription $AZURE_SUBSCRIPTION_ID
- func azure functionapp publish $FUNCTION_APP --no-build
我想从最轻的 DockerFile 部署 Azure 功能(节点 and/or python)。
所以我需要能够 运行 az login
和 func
.
目前唯一运行良好的是 2.27GB。
我用 alpines 尝试了很多可能性,但调用 func
总是失败。
示例:
-
- [失败] Alpine Latest - 从 pip 安装 CLI 并从 NPM 安装 func (1.36GB)
FROM alpine:latest
RUN \
apk update && \
apk add bash make py3-pip && \
apk add --virtual=build gcc libffi-dev musl-dev openssl-dev python3-dev make && \
pip3 --no-cache-dir install -U pip && \
pip3 install azure-cli && \
apk del --purge build
RUN apk add --update nodejs nodejs-npm && \
npm i -g azure-functions-core-tools@latest --unsafe-perm true
当我调用 func -h
时出现错误:
events.js:291
throw er; // Unhandled 'error' event
^
Error: spawn /usr/local/lib/node_modules/azure-functions-core-tools/bin/func ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19)
at onErrorNT (internal/child_process.js:470:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:274:12)
at onErrorNT (internal/child_process.js:470:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'spawn /usr/local/lib/node_modules/azure-functions-core-tools/bin/func',
path: '/usr/local/lib/node_modules/azure-functions-core-tools/bin/func',
spawnargs: [ '-h' ]
}
-
- [失败] 节点(12 或 14)alpine - 从 pip 安装 CLI,从 NPM 安装 func (1.55GB)
FROM node:12-alpine # or 14-alpine
RUN \
apk update && \
apk add bash make py3-pip && \
apk add --virtual=build gcc libffi-dev musl-dev openssl-dev python3-dev make && \
pip3 --no-cache-dir install -U pip && \
pip3 install azure-cli && \
apk del --purge build
RUN npm i -g azure-functions-core-tools@3 --unsafe-perm true
与 alpine 相同的错误
-
- [成功]node:12/apt安装(2.27GB):
FROM node:12
# Install base dependencies
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y -q --no-install-recommends \
curl \
lsb-release \
apt-transport-https \
gnupg \
ssh \
&& apt-get clean
# Install azure function
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \
&& mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg \
&& sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list' \
&& sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/debian/$(lsb_release -rs | cut -d'.' -f 1)/prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
#Install Azure CLI
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
RUN AZ_REPO=$(lsb_release -cs) && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list
RUN apt-get update \
&& apt-get install -y azure-functions-core-tools \
&& apt-get install azure-cli
最新的 azure-cli
docker image 是用 Alpine 构建的。
不幸的是,我无法在 Alpine 上也 运行 azure-functions-core-tools
...(参见 https://github.com/Azure/azure-functions-core-tools/issues/1358)
但是,我设法从 ubuntu:20.04
大小1.77GB,运行ning在GitlabCI没有问题(镜像也发布在我们的Gitlab中,所以pull还是蛮快的)
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.gpg
RUN AZ_REPO=$(lsb_release -cs) && \
echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list && \
echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$AZ_REPO-prod $AZ_REPO main" | tee /etc/apt/sources.list.d/dotnetdev.list
RUN apt-get update && apt-get install -y azure-cli azure-functions-core-tools-3
RUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash && apt-get install -y nodejs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
对于任何试图使其不受大小影响的人,这里有一个使用官方 Microsoft 图像的解决方案,最终为 2.81 GB。基于 this issue comment 我能够让它工作。但是,它需要一些修改。这是我最终得到的结果:
# Dockerfile
FROM mcr.microsoft.com/azure-functions/python:2.0.12493-python3.6-buildenv
# Install azure-cli
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install azure-cli
# Install azure-functions-core-tools
RUN apt-get install -y build-essential
RUN apt-get install -y gcc musl-dev python3-dev libffi-dev libssl-dev cargo
RUN apt-get update && apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
RUN curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.gpg
RUN AZ_REPO=$(lsb_release -cs) && \
RUN echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list && \
RUN echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$AZ_REPO-prod $AZ_REPO main" | tee /etc/apt/sources.list.d/dotnetdev.list
RUN apt-get update && apt-get install -y azure-functions-core-tools-3
您可以直接在本地使用它,但我需要它用于 GitLab CI 管道。所以首先你需要构建镜像并将其推送到 GitLab 容器存储库:
docker build -t registry.gitlab.com/GROUP/PROJECT/REPO/container-name .
docker push registry.gitlab.com/GROUP/PROJECT/REPO/container-name:latest
最后在 GitLab CI 管道中使用它:
# .gitlab-ci.yml
deploy:
image: registry.gitlab.com/GROUP/PROJECT/REPO/container-name:latest
stage: deploy
tags:
- dockerbuild-machine
script:
- pip3 install --target=".python_packages/lib/python3.8/site-packages" -r requirements.txt
- az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID
- az account set --subscription $AZURE_SUBSCRIPTION_ID
- func azure functionapp publish $FUNCTION_APP --no-build