Docker עזרה הבנה
-
אני באמצע לקרוא בתיעוד פה https://docs.docker.com/get-started/part2/
את הDockerfile הבא:# Use the official image as a parent image FROM node:current-slim # Set the working directory WORKDIR /usr/src/app # Copy the file from your host to your current location COPY package.json . # Run the command inside your image filesystem RUN npm install # Inform Docker that the container is listening on the specified port at runtime. EXPOSE 8080 # Run the specified command within the container. CMD [ "npm", "start" ] # Copy the rest of your app's source code from your host to your image filesystem. COPY . .
בCOPY הראשון מועתק רק הקובץ package.json, ובשני שבשורה האחרונה מועתקים כל קבצי הקוד שבתיקיה לתוך הקונטיינר.
בשורה האחרונה הם מעתיקים את קוד המקור לתוך הקונטיינר,
אני מבין שהדברים מתבצעים לפי סדר ואפילו מחכים לסיום כל שלב (סינכורני), אז איך הnpm start ירוץ בלי שום קבצים? -
The CMD directive is the first example of specifying some metadata in your image that describes how to run a container based on this image. In this case, it’s saying that the containerized process that this image is meant to support is npm start.
אם הבנתי נכון, זה אומר שהפקודה CMD לא מריץ את הפקודה, (זה מה ש-RUN עושה), זה רק מגדיר מה יהיה פקודת ברירת מחדל שהקונטיינר יריץ
יותר הרחבה כאן
Note: Don’t confuse RUN with CMD. RUN actually runs a command and commits the result; CMD does not execute anything at build time, but specifies the intended command for the image.
-
@dovid
כמו ש @yossiz אמר, CMD מיועד להגדיר איזה פקודה תרוץ בעת הרצת הדוקר.
פעמים שמשלבים את זה עם ENTRYPOINT כך שאפשר לשנות פרמטרים לפקודת הרצה בקלות בלי לשנות את הפקודה עצמהאם תהית למה מבצעים COPY מספר פעמים במקום להעתיק את הכל כבר בהתחלה,
התשובה היא בגלל המבנה של השכבות, זאת אומרת שכל ועוד לא היה שינוי בקבצי המקור של שכבה מסוימת - למשל במקרה שלך package.json - אז רק השכבות העליונות יותר יבנו מחדש - אלו שהיה בהם שינוי.
כך, ברגע שרק באחת השכבות העליונות מוסיפים את כל קבצי האפליקציה - תהליך הbuild רוב הפעמים יהיה קצר יותר ולא יכלול התקנה של תלויות מחדש..