Как скопировать файлы библиотеки между этапами многоэтапной сборки Docker при сохранении символических ссылок? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть Dockerfile, который разбит на двухэтапную многоэтапную сборку Docker.На первом этапе создается базовая среда сборки gcc, в которой компилируется ряд библиотек C и C ++.На втором этапе команда COPY --from= используется для копирования файлов библиотеки с первых этапов /usr/local/lib/libproto* в текущее изображение.

Проблема, с которой я сталкиваюсь, заключается в том, что первое изображение содержит символические ссылки из общего имени файла библиотеки на конкретное версионное имя файла.AFAIK, это обычная практика в Debian и многих других системах Linux.Команда Docker COPY, похоже, не понимает символические ссылки, поэтому вместо этого создает две полные копии библиотечных файлов.Это приводит к увеличению размера Docker Image и предупреждению от более поздних команд apt-get до мелодии ldconfig: /usr/local/lib/libprotobuf.so.17 is not a symbolic link.


Мой конкретный файл в настоящее время выглядит следующим образом:

#Compile any tools we cannot install from packages
FROM gcc:7 as builder
USER 0
RUN \
  apt-get -y update && \
  apt-get -y install \
    clang \
    libc++-dev \
    libgflags-dev \
    libgtest-dev
RUN \
  # Protocol Buffer & gRPC
  # install protobuf first, then grpc
  git clone -b $(curl -L https://grpc.io/release) \
      https://github.com/grpc/grpc /var/local/git/grpc && \
    cd /var/local/git/grpc && \
    git submodule update --init && \
    echo "--- installing protobuf ---" && \
    cd third_party/protobuf && \
    ./autogen.sh && ./configure --enable-shared && \
    make -j$(nproc) && make install && make clean && ldconfig && \
    echo "--- installing grpc ---" && \
    cd /var/local/git/grpc && \
    make -j$(nproc) && make install && make clean && ldconfig


FROM debian
LABEL \
 Description="Basic Debian production environment with a number of libraries configured" \
 MAINTAINER="Mr Me"
ARG prefix=/usr/local
ARG binPath=$prefix/bin
ARG libPath=$prefix/lib
# Copy over pre-made tools
# Protocol Buffer
COPY --from=builder /usr/local/lib/libproto* $libPath/
# gRPC
COPY --from=builder /usr/local/lib/libaddress_sorting.so.6.0.0 $libPath/
COPY --from=builder /usr/local/lib/libgpr* $libPath/
COPY --from=builder /usr/local/lib/libgrpc* $libPath/
RUN ldconfig
# Install remaining tools using apt-get
RUN apt-get -y update && \
  apt-get -y install \
    libhdf5-dev \
    libssl1.1 \
    uuid-dev;

Как вы можете видеть, я пытаюсь добавить последние версии gRPC и Protocol Buffer в образ среды выполнения на основе Debian.

1 Ответ

0 голосов
/ 13 ноября 2018

Это скорее обходной путь, чем ответ.

Вы можете скопировать файлы, скопировать архив во второй контейнер и затем распаковать их.

Tar поддерживает символические ссылки по умолчанию.

...