问题
I have a Dockerfile which is split into a two-stage multi-stage docker build. The first stage generates a basic gcc build environment in which a number of C and C++ library are compiled. The second stage uses the COPY --from=
command to copy the library files from the first stages /usr/local/lib/libproto*
to the current image's.
The problem I am seeing is that the first image contains symlinks from a generic library file name to a specific versioned file name. AFAIK this is common practice within Debian and many other Linux systems. Docker's COPY
command does not seem to understand symlinks so instead makes two complete copies of the library files. This results in a larger Docker Image size and warnings from later apt-get
commands to the tune of ldconfig: /usr/local/lib/libprotobuf.so.17 is not a symbolic link
.
My specific file presently looks like:
#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;
As you can see I am trying to add the latest versions of gRPC and Protocol Buffer to a Debian based runtime image.
回答1:
This is more of a workaround than an answer.
You could tar the files, copy the tarball to the second container and then untar them.
Tar maintains symbolic links by default.
来源:https://stackoverflow.com/questions/53281570/how-to-copy-library-files-between-stages-of-a-multi-stage-docker-build-while-pre