%files를 사용하여 호스트에서 특이성 이미지로 복사할 때 특이성 빌드 오류 "해당 파일 또는 디렉터리가 없습니다"

%files를 사용하여 호스트에서 특이성 이미지로 복사할 때 특이성 빌드 오류 "해당 파일 또는 디렉터리가 없습니다"

다음과 같은 특이점 정의 파일이 있습니다.

Bootstrap: docker
From: nvcr.io/nvidia/tensorflow:21.08-tf2-py3

%files
    /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/requirements.txt /tmp/requirements.txt
    /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/aocl-linux-aocc-2.2.0_1_amd64.deb /tmp/aocl-linux-aocc-2.2.0_1_amd64.deb

%environment
    export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
    export LD_LIBRARY_PATH="/usr/local/lib/kla:${LD_LIBRARY_PATH}"
    export MODEL_PATH="/home/data"
    export LD_LIBRARY_PATH="/usr/local/lib/tensorflow:/usr/local/lib/python3.8/dist-packages/tensorflow/:${LD_LIBRARY_PATH}"
    export LD_LIBRARY_PATH="/opt/amd-fftw/lib:${LD_LIBRARY_PATH}"

%post
    echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    dpkg -i /tmp/aocl-linux-aocc-2.2.0_1_amd64.deb && rm -rf /tmp/aocl-linux-aocc-2.2.0_1_amd64.deb
    python -m pip install --upgrade pip
    pip --no-cache-dir --no-cache install --user -r /tmp/requirements.txt

특이점 이미지를 빌드할 때 다음 오류가 발생합니다: ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/tmp/requirements.txt'error: cannot access archive '/tmp/aocl-linux-aocc-2.2.0_1_amd64.deb': No such file or directory.

내가 이해한 바에 따르면 %files는 해당 파일을 이미지의 /tmp에 복사했습니다. 그러나 빌드 로그를 확인하면 다음 메시지가 표시됩니다 INFO: Copying /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/requirements.txt to /tmp/build-temp-687487635/rootfs/tmp/requirements.txt INFO: Copying /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/aocl-linux-aocc-2.2.0_1_amd64.deb to /tmp/build-temp-687487635/rootfs/tmp/aocl-linux-aocc-2.2.0_1_amd64.deb.

이 두 파일이 실제로 에 복사되었는지 확인하기 위해 정의 파일에 지정했습니다 \tmp. ls -l /tmp이 파일은 에서 찾을 수 없습니다 \tmp. 또한 정의 파일에 지정하여 파일 중 하나를 검색했지만 find / -name aocl-linux-aocc-2.2.0_1_amd64.deb다음 오류가 발생했습니다 find: File system loop detected; ‘/tmp/build-temp-565811705/rootfs’ is part of the same file system loop as ‘/’.

답변1

다음 댓글을 참고하세요.깃허브:

빌드 시 /var/tmp호스트 시스템에서 설치됩니다.

  1. 도커 이미지가 디스크로 추출됩니다.
  2. 당신의 파일이제 추출된 이미지에 복사됩니다./var/tmp
  3. 빌드가 %post실행되면,호스트의 tmp 디렉터리가 컨테이너에 마운트됩니다. 이렇게 하면 추출된 이미지에 복사된 파일이 숨겨집니다.

/tmp /var/tmp /home그렇지 않은 경로 에서도 작동해야 합니다 .

반품또 다른 댓글github의 또 다른 문제:

...호스트 /tmp 및 /var/tmp는 %post 동안 /tmp 및 /var/tmp 컨테이너 디렉토리 위에 마운트됩니다...

두 가지 옵션이 있습니다:

  1. 대신 파일을 다른 폴더에 복사하세요 /tmp. 예: /opt.
%files
    /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/requirements.txt /opt/requirements.txt
    /home/zfan/sandbox/Virgo_Algo/DevEnv/AMD/aocl-linux-aocc-2.2.0_1_amd64.deb /opt/aocl-linux-aocc-2.2.0_1_amd64.deb

...

%post
    ...
    dpkg -i /opt/aocl-linux-aocc-2.2.0_1_amd64.deb && rm -rf /opt/aocl-linux-aocc-2.2.0_1_amd64.deb
    ...
    pip --no-cache-dir --no-cache install --user -r /opt/requirements.txt
  1. %post섹션 $SINGULARITY_CONTAINER/tmp에서는 /tmp.

/tmp호스트는 /tmp컨테이너 내부에 마운트 되므로 빌드( )에 사용된 컨테이너의 루트 파일 시스템을 $SINGULARITY_CONTAINER가리키며 파일이 복사되는 호스트에서 시작됩니다 ./tmp/build-temp-XXX/rootfs$SINGULARITY_CONTAINER/tmp/tmp/build-temp-XXX/rootfs/tmp

%post
    ...
    dpkg -i $SINGULARITY_CONTAINER/tmp/aocl-linux-aocc-2.2.0_1_amd64.deb && rm -rf $SINGULARITY_CONTAINER/tmp/aocl-linux-aocc-2.2.0_1_amd64.deb
    ...
    pip --no-cache-dir --no-cache install --user -r $SINGULARITY_CONTAINER/tmp/requirements.txt

관련 정보