这是我的Dockerfile:
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y apt-utils apt-transport-https && \
apt-get install -y lib32z1 xinetd && \
apt-get -y dist-upgrade
RUN useradd -m ctf
WORKDIR /home/ctf
RUN cp -Rf /lib* /home/ctf && \
cp -Rf /usr/lib* /home/ctf
COPY /lib/x86_64-linux-gnu/libc.so.6 /usr/local/lib/
ENV LD_LIBRARY_PATH=/usr/local/lib/
RUN ldconfig
RUN mkdir /home/ctf/dev && \
mknod /home/ctf/dev/null c 1 3 && \
mknod /home/ctf/dev/zero c 1 5 && \
mknod /home/ctf/dev/random c 1 8 && \
mknod /home/ctf/dev/urandom c 1 9 && \
chmod 666 /home/ctf/dev/*
RUN mkdir /home/ctf/bin && \
cp /bin/sh /home/ctf/bin && \
cp /bin/ls /home/ctf/bin && \
cp /bin/cat /home/ctf/bin
COPY ./ctf.xinetd /etc/xinetd.d/ctf
COPY ./xinetedService.sh /xinetedService.sh
RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail
RUN chmod +x /xinetedService.sh
COPY ./files/ /home/ctf/
RUN chown -R root:ctf /home/ctf && \
chmod -R 750 /home/ctf && \
chmod 740 /home/ctf/flag.txt
CMD ["/xinetedService.sh"]
EXPOSE 9999
下面的行给出错误。COPY /lib/x86_64-linux-gnu/libc.so.6 /usr/local/lib/
错误:
=> ERROR [ 6/15] COPY /lib/x86_64-linux-gnu/libc.so.6 /usr/local/lib/ 0.0s
------
> [ 6/15] COPY /lib/x86_64-linux-gnu/libc.so.6 /usr/local/lib/:
------
Dockerfile:16
--------------------
14 | cp -Rf /usr/lib* /home/ctf
15 |
16 | >>> COPY /lib/x86_64-linux-gnu/libc.so.6 /usr/local/lib/
17 | ENV LD_LIBRARY_PATH=/usr/local/lib/
18 | RUN ldconfig
--------------------
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref a298254a-94ff-4e45-b581-67b72180e20a::opz82ic9gri5w5vumh2zpzlew: "/lib/x86_64-linux-gnu/libc.so.6": not found
1条答案
按热度按时间mwyxok5s1#
你不能从主机系统
COPY
任意文件到镜像中,只能是属于 *build context目录 * 的文件;也就是作为最后一个参数传递给docker build
的目录名,通常是当前目录.
。在您的情况下,您根本不需要此
COPY
。ubuntu
基本映像已经包含了一个动态加载器和正常Linux运行时的其余部分。您也不需要创建一个影子/dev
树或一个单独的/home/.../bin
目录,其中包含系统二进制文件的副本。如果你确实有不寻常的需求,需要手动操作系统C库之类的东西,记住Docker镜像有一个独立的文件系统也会有帮助。如果您从源代码构建GNUlibc,那么镜像中的
/lib
树将与主机和其他容器的/lib
目录隔离。这可能是尝试自己构建Linux映像FROM scratch
的一种方法;一方面,这是一个Maven级的项目,但另一方面,学习在容器中完成它将使您不会使主机无法使用。