COPY विफल: स्टेट / var / lib / docker / tmp / docker-xxx: ऐसी कोई फ़ाइल या निर्देशिका नहीं है

Aug 18 2020

मेरे पास एक डॉक इमेज बनाने के लिए एक गिथब एक्शन वर्कफ़्लो है:

name: Backend-Demo Docker Image CI
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Login to Azure Container Registry
        run: echo ${{ secrets.REGISTRY_PASSWORD }} | docker login ${{ secrets.LOGIN_SERVER_URL }} -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin - name: Get the version id: vars run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
      - name: Build the tagged Docker image
        run: docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0

डॉकफाइल है:

FROM openjdk:14-alpine
MAINTAINER example.com
RUN mkdir -p /opt/demo-0.0.1/lib
# Setting application source code working directory
WORKDIR /opt/demo-0.0.1/
COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
# ADD target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/

RUN sh -c 'touch demo-0.0.1-SNAPSHOT.jar'
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar"]

लेकिन जब मैं इस वर्कफ़्लो को निष्पादित करता हूं तो मुझे यह त्रुटि COPYनिर्देश पर मिली है :

Step 5/8 : COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY failed: stat /var/lib/docker/tmp/docker-builder851513197/target/demo-0.0.1-SNAPSHOT.jar: no such file or directory
##[error]Process completed with exit code 1.

मैं जाँच कर रहा हूँ और यह एक विशिष्ट त्रुटि दिखती है जब हमारे Dockerfileनिर्देश की तरह एक अलग निर्देशिका में फ़ाइल हमारे पास है :

docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0

मेरे पास .dockerignoreफाइल भी नहीं है और मेरे डॉकरीफाइल को Dockerfileठीक कहा जाता है ।

target/demo-0.0.1-SNAPSHOT.jarमैं जिस फाइल को कॉपी करने की कोशिश कर रहा हूं, वह मेरे गितुब रिपॉजिटरी में मौजूद है, निश्चित नहीं कि संदर्भ के साथ क्या हो सकता है, लेकिन शायद यह जवाब एक अच्छा संकेत हो सकता है?

जवाब

4 DavidMaze Aug 18 2020 at 07:46

जब तुम दौड़ते हो

docker build . --file backend/Dockerfile ...

पथ तर्क संदर्भ निर्देशिका. बन जाता है । (डॉकर वास्तव में खुद को इस डायरेक्टरी ट्री की एक प्रति भेजता है, जो कि रास्ता कहाँ से आता है।) डॉर्कफाइल के सापेक्ष नहीं बल्कि संदर्भ निर्देशिका के निर्देश और निर्देश स्रोत के सापेक्ष हैं।/var/lib/docker/tmp/...COPYADD

यदि आपका स्रोत पेड़ जैसा दिखता है

.
+-- backend
| \-- Dockerfile
\-- target
  \-- demo-0.0.1-SNAPSHOT.jar

जो आपके द्वारा दिखाए गए डॉकरफाइल से मेल खाता है। लेकिन अगर इसके बजाय आपके पास है

.
+-- backend
  +-- Dockerfile
  \-- target
    \-- demo-0.0.1-SNAPSHOT.jar

आपको वह त्रुटि दिखाई देगी जो आप देखते हैं।

यदि आपको संदर्भ निर्देशिका के बाहर कुछ भी संदर्भित करने की आवश्यकता नहीं है, तो आप बस उस निर्देशिका को बदल सकते हैं जिसे आप पास कर रहे हैं docker build

COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
docker build backend ...

या, यदि आपके पास अन्य सामग्री है जिसे आपको कॉपी करने की आवश्यकता है, तो आपको COPYसबसे ऊपरी निर्देशिका के सापेक्ष होने के लिए पथ बदलने की आवश्यकता है ।

COPY backend/target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY common/config/demo.yml /opt/demo-0.0.1/etc/demo.yml
docker build . -f backend/Dockerfile ...
1 serialkiller Aug 18 2020 at 00:58

WORKDIR सिर्फ आपको बताता है कि अन्य आदेशों को कहां से क्रियान्वित किया जाएगा। एक महत्वपूर्ण बिंदु यह है कि WORKDIR, wrt docker निर्देशिका का काम करता है, न कि स्थानीय / git निर्देशिका का। आपके उदाहरण के अनुसार, WORDIR संदर्भ को /opt/emo-0.0.1/ पर नहीं लेता है। , लेकिन बस डॉकटर के अंदर /opt/demo-0.0.1/ के रूप में एक खाली निर्देशिका बनाता है । डॉकरीफाइल कार्य करने के लिए, आपको COPY कमांड में पूर्ण पथ देना चाहिए जैसे कि COPY /opt/demo-0.0.1/target/demo-0.0.1-SNAPSHOT.jar/opt/demo-0.0.1/lib/demo- 0.0.1-SNAPSHOT.jar । सुनिश्चित करें कि Dockerfile / Opt Directory के समान स्तर पर है।