קורס Docker, Compose and Kubernetes שיעור דוגמה לפיתוח מיקרו סרביס מלא - חלק 3 ה API


זהו נושא דיון מלווה לערך המקורי שב־https://www.tocode.co.il/bundles/docker/lessons/compose-dev-example-part3

נתקלתי בבעיית הרשאות.

להבדיל ממה שמודגם בווידאו של הפרק, אצלי גם ביצירת תקייה פנימית, עדיין מתקבלת אותה הודעת שגיאה:

אגב, לא ברור לי למה, למרות שאני על root כשאני יוצר את תת-התיקייה בקונטיינר, היא נוצרת כשייכת ל-node
מחוץ לקונטיינר (במחשב שלי) כל התיקיות האלו נראות כשייכות למשתמש הרגיל שלי (מבילי שבצעתי שינויים).

במצב הזה אני לא יכול להריץ את npx express-generator --no-view

היי @ynonp , בעיית המשך - nodemon לא מתפקד כמצופה.
לכאורה זה לא העיניין בקורס דוקר, אבל רוצה להבין אם זה נובע ממשהו שאני עושה לא נכון עם הקונטיינרים.

[השתמשתי ב: express-generator מהמחשב שלי, כי זה לא עבד מתוך הקונטיינר כמפורט מעלה]
למרות שהפקודה היא עם nodemon, לאחר שינוי ושמירה התוכן לא מתעדכן:

אחרי הורדה ההעלאה מחדש, מקבל תוכן תקין, אבל שוב בשינוי הטקסט (ושמירה) אין עדכון אוטומטי כמצופה:

אם יש צורך, זה הקטע הרלוונטי מה: docker-compose.yml

  server:
    image: node:17
    working_dir: /app
    command: bash -c "npm install && npm install -g nodemon && nodemon bin/www"
    env_file: ./env/dev.env
    environment:
      DB_HOST: db
    secrets:
      - postgres-passwd
    volumes:
      - ./server:/app
    ports:
      - "3000:3000"

איזה קובץ אתה מעדכן?

בהתחלה דיברתי על הפעלת הפקודה npx express-generator --no-view כדי ליצור קבצים של פרויקט express בקונטיינר.
כפי שהדגמת, זה לא עובד בתיקיית app המקושרת לווליום שנוצר בעקבות המיפוי עקב בעיית הרשאות. אבל שלא כמו שהראת, יצירת תת-תיקייה והפעלת הפקודה הנ"ל בתוכה, עדיין מושפעת אצלי מהבעייה הזו (ראה צילום מסך מהתגובה הראשונה שלי).

בהמשך, אחרי שיצרתי את הפרויקט במחשב שלי ולא בקונטיינר (כדי לעקוף את הבעייה הנ"ל), עקבתי אחרי הווידאו שלך ועדכנתי כמוך את הקובץ routs/index.js כדי להחליף את render ב-send. למרות ש-nodemon מופעל (כמו שרואים בצילום המסך) השינוי בקובץ (ושמירתו) לא גרם לעדכון אוטומטי.
אחרי הורדה ההעלאה מחדש עם docker-compose השינוי עבר והוצג Hello world כשניגשים אליו.
שיניתי רק את הטקסט, כדי לראות אם הפעם nodemon יעבוד כמצופה, אך כפי שאפשר לראות מצילום הלוג של השרת, קיבלתי 304 והתצאה לא השתנתה.

אני חושד ששתי הבעיות קשורות ומשהו במיפוי של הווליום לא מתפקד כפי שאתה הצגת.

אשמח לנסות אצלי את הפרויקט שאתה מריץ כדי לראות אם אצלי זה עובד ויש הבדל בגירסאות של דוקר או משהו כזה, או שמשהו בפרויקט שבור

יכול להעלות רק את הפרויקט הזה לגיטהאב או משהו דומה ולהדביק פה לינק?

לפחות לשלב הראשון (בו אני לא מצליח להפעיל npx express-generator מתוך תת-תקייה של app בקונטיינר) אתה יכול להשתמש בתוכן של התקיית before שלך בפרק 11:

כשקובץ docker-compose.yml אצלי הוא:

version: "3.9"

services:
  server:
    image: node:17
    working_dir: /app
    command: sleep infinity
    env_file: ./env/dev.env
    environment:
      DB_HOST: db
    secrets:
      - postgres-passwd
    volumes:
      - ./server:/app
    ports:
      - "3000:3000"

  query-script:
    image: node:17
    working_dir: /app
    command: sleep infinity

    env_file: ./env/dev.env

    environment:
      DB_HOST: db

    volumes:
      - ./query-script:/app

    secrets:
      - postgres-passwd
      - weatherapi-key

  db:
    image: postgres:14.2
    volumes:
      - "./db:/docker-entrypoint-initdb.d"

    secrets:
      - postgres-passwd

    env_file: ./env/dev.env

    ports:
      - "5432:5432"

secrets:
  postgres-passwd:
    file: ./secrets/postgres_password

  weatherapi-key:
    file: ./secrets/weather-apikey

בשלב הזה מריץ:
docker-compose up -d
ואחרי שעולים הקונטיינרים מריץ:
docker-compose exec server /bin/bash
ובפנים:

אלו פרטי הגרסאות שאני עובד איתן במחשב שלי:

OS: Windows 11 Pro, Version 21H2
Terminal (bash): Ubuntu 20.04.4 LTS
Docker Desktop 4.7.1
Docker version 20.10.14
Docker Compose version v2.4.1

בנוסף לתגובה מעל @ynonp, דחפתי ל-github שלי (fork מהמאגר שלך) ענף בשם ch11-dev המחיל תקייה בשם new צחת פרק 11 עם המצב הסופי - פרויקט עובד, אבל ה-nodemon לא מעדכון אוטומטית בשינויים

הי לקחתי אליי את הפרויקט שלך והרצתי והכל עבד. כלומר בלוג ראיתי את ההודעות:

new-server-1        | [nodemon] watching path(s): *.*
new-server-1        | [nodemon] watching extensions: js,mjs,json
new-server-1        | [nodemon] starting `node bin/www`
new-server-1        | GET / 304 438.144 ms - -
new-server-1        | [nodemon] restarting due to changes...
new-server-1        | [nodemon] starting `node bin/www`

מה שמעלה את החשד שמשהו לא תואם בהתקנות.

כן ראיתי שאתה מפעיל docker-compose. זה לא אותו דבר כמו docker compose (רווח במקום המקף). אצלי שני הכלים עבדו אבל ראיתי מצבים בהם רק הכלי docker compose עובד, כי הוא החדש יותר. תוכל לנסות עם docker compose up, כלומר רווח במקום המקף, ולראות אם זה משפר את המצב?

אפשר לראות גם צילום מסך של הפעלת הפקודה docker compose up ? לא ראיתי את זה בתמונות שצירפת

לא הייתי מודע ש docker-compose ו: docker compose קוראים לתוכנות שונות, אבל לצערי גם כשאני מעלה את הקונטיינרים בכלי docker compose עדיין נצפת אותה התנהגות (nodemon לא מאתחל כשר יש שינוי בקבצים).

להלן צילומי מסך של פלט docker compose up
(השורה האחרונה לאחר כניסה בדפדפן אל http://localhost:3000)


הפלט הנ"ל לא השתנה גם אחרי עדכון קובץ: server/routes/index.js

אחרי כניסה נוספת בדפדפן אל http://localhost:3000 מקבלים 304 ללא שינוי:

בוא ננסה עוד משהו. יש לנודמון מצב legacy שמתמודד עם סביבות בעייתיות. תוכל נסות להחליף את פקודת ה nodemon ב:

nodemon --legacy-watch bin/www

וספר אם זה עובד?

היי @ynonp, עכשיו nodemon מתנהג כצפוי:

וכדי להיות בטוח שהבעייה המקורית קיימת, הורדתי את הקונטיינרים, מחקתי רק את --legacy-watch, הרמתי שוב, שיניתי את אותו קובץ כמו קודם (routes/index.js) ושוב nodemon לא מאתחל.

אז עובד כצתופםה עם legacy-watch, אבל זה לא מסביר מה הבעייה. או שאתה הצלחת להבין?

וגם אם הנ"ל לא קשור לבעיות עם מיפוי הווליום, עדיין יותר חשוב (עבורי) למה יש בעיות הרשאות ואי אפשר להתקין עם express-generator (ואני מניח עם כלים דומים) בתוך קונטיינר - כי בהחלט מעוניין לעבוד עם קונטיינרים כדי לפתח בשפות וכלים שונים.

הי אוקיי אז טוב שהצלחנו למצוא את הבעיה עם ה nodemon, או לפחות למצוא דרך לגרום לו לעבוד. הבעיה בגדול היא שמערכת ההפעלה אצלך לא מעבירה אירועי גישה למערכת קבצים לדוקר. אני רואה שהפרויקט שלך שמור על תיקיית C כלומר במערכת הקבצים של Windows ולא של ה WSL אז יכול להיות שאתה לא עובד עד הסוף כמו שצריך עם ה WSL.

נסה מ cmd רגיל להפעיל את הפקודה:

wsl --list

וספר לי מה זה מדפיס לך

עלית על הבעייה! מסתבר שזו אכן הייתה סוג-של בעיית הרשאות.
חשבתי שיהיה לי יותר נוח לעבוד עם תקייה שכבר ייצרתי מראש לקורס במערכת ההפעלה של חלונות, לכן את הפעולות בצעתי שם גם מתוך ה-WSL. עכשיו פשוט עשיתי clone לדוגמאות הקורס בתוך ה-WSL ubuntu והכל עובד.
אגב, במצב הזה אצלי הוא כן מאפשר לעבוד ישירות בתיקיית app מתוך הקונטיינר (ולא חייב אותי ליצור תת תיקייה).

תודה על העזרה!

לייק 1