COPY विफल: स्टेट / var / lib / docker / tmp / docker-xxx: ऐसी कोई फ़ाइल या निर्देशिका नहीं है
मेरे पास एक डॉक इमेज बनाने के लिए एक गिथब एक्शन वर्कफ़्लो है:
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
मैं जिस फाइल को कॉपी करने की कोशिश कर रहा हूं, वह मेरे गितुब रिपॉजिटरी में मौजूद है, निश्चित नहीं कि संदर्भ के साथ क्या हो सकता है, लेकिन शायद यह जवाब एक अच्छा संकेत हो सकता है?
जवाब
जब तुम दौड़ते हो
docker build . --file backend/Dockerfile ...
पथ तर्क संदर्भ निर्देशिका.
बन जाता है । (डॉकर वास्तव में खुद को इस डायरेक्टरी ट्री की एक प्रति भेजता है, जो कि रास्ता कहाँ से आता है।) डॉर्कफाइल के सापेक्ष नहीं बल्कि संदर्भ निर्देशिका के निर्देश और निर्देश स्रोत के सापेक्ष हैं।/var/lib/docker/tmp/...
COPY
ADD
यदि आपका स्रोत पेड़ जैसा दिखता है
.
+-- 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 ...
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 के समान स्तर पर है।