Pergunta em questão: se eu precisar copiar centenas de bibliotecas de dependências entre compilações de estágios no Docker, como faço isso sem atingir a profundidade máxima?
O que estou tentando fazer: criar uma imagem de contêiner tão pequena quanto possível contendo Python e ffmpeg para uso com o AWS Lambda.
O que eu sei que posso fazer:
FROM ubuntu:latest AS build
RUN apt-get update && apt-get clean && apt-get install -y ffmpeg
FROM python:3.12-slim-bookworm
COPY --from=build /usr/bin/ffmpeg /usr/bin/ffmpeg
COPY --from=build /usr/lib/aarch64-linux-gnu/* /usr/lib/aarch64-linux-gnu/
WORKDIR /app
CMD ["foo"]
Produz uma imagem de contêiner funcional, mas é enorme, mais de 1 GB.
Gostaria de copiar apenas o ffmpeg e suas dependências, mas esse é o problema. ldd
me diz que há mais de 200 dependências em /lib, e ter tantas COPY
instruções leva a exceder a profundidade máxima durante a compilação. Tentando evitar:
COPY --from=build /usr/lib/lib1 /usr/lib/lib1
COPY --from=build /usr/lib/lib2 /usr/lib/lib2
...
COPY --from=build /usr/lib/lib227 /usr/lib/lib227
Existe uma maneira de fazer um loop dentro do Dockerfile a partir de um arquivo txt externo ou algum outro mecanismo para copiar centenas de dependências sem exceder a profundidade máxima?
Parece que o ffmpeg é muito grande, principalmente. Se eu tentar instalar o ffmpeg em um novo contêiner limpo do Ubuntu
Agora, parte disso é formato de arquivo e drivers de dispositivo que você não precisa necessariamente. Eles vêm por meio do tipo de dependência "recommends" do Debian, e você pode
apt-get install --no-install-recommends
. Isso ajuda, mas apenas algunsA menos que você tenha um motivo real para acreditar que até mesmo esse conjunto de pacotes está trazendo arquivos extras que não são necessários para executar a ferramenta, você está preso a uma imagem que é várias centenas de megabytes maior. (E se você acha que há uma dependência desnecessária, registrar um relatório de bug do Debian ou do Ubuntu pode fazer sentido.)
Em princípio, em vez de fazer um monte de
COPY
s minúsculos, você pode montar uma árvore temporária na primeira imagem que contém os arquivos que você precisaCOPY
, e apenas movê-los uma vez. Isso também significa que você pode fazer isso programaticamente. TalvezEsperançosamente, isso coletaria de forma confiável (até analisar
ldd
a saída de ) todas as bibliotecas compartilhadas C das quais o programa depende. No entanto, isso não será necessariamente todos os arquivos de que você realmente precisa; o próprio ffmpeg inclui um punhado de arquivos em/usr/share/ffmpeg
, por exemplo, e rastreá-los é um problema bastante aberto. Se você fizer isso com sucesso, provavelmente recriou os arquivos exatos queapt-get install ffmpeg
instala.