قطع ارتباط volume در کانتینر

docker
docker-compose

#1

با درود خدمت دوستان گرامی. سایتی روی سروری به صورت آزمایشی بالا آماده است و بعد از تنظیمات و نمایش و … برای چند نفر. این سایت تقریبا به حال خودش گذاشته شد ولی بعد از چند ساعت با اینکه هیچ ترافیکی نداشت سایت به شکل زیر در آمد

و من با ریست کردن کانتینر انجینکس این مشکل رو حل کردم

ولی الان نمی تونم بفهمم چه دلیلی باعث این مشکل شده است. در لاگ های انجنیکس فقط گفته در زمان x به فایلهای استاتیک مثل عکس و غیر دسترسی نداره و اطلاعات بیشتری پیدا نکردم

تنظیمات volume در کانتینر nginx

 volumes:
      - /home/my_user/docker/my_site/elixir/dev/wedding_card/priv/static:/var/www/my_site/html

قبل از اینکه کانتینر انجینکس رو ریست بکنم، رفتم داخل اون تا مسیر volume رو چک کنم به این صورت

sudo docker exec -it nginx_master ash
/ # cd /var/www/my_site/html/
ash: getcwd: No such file or directory
(unknown)

/ # cd /var/www/my_site/
/var/www/my_site # ls -l
total 4
drwxr-xr-x    0 1001     1001             0 Jan  2 23:56 html

/var/www/my_site/# cd html/
ash: getcwd: No such file or directory

خطای بالا رو سرچ کردم و یه مورد مشابه پیدا کردم که در سیستم عامل مک این مشکل رو داشتن، البته من این مشکل رو در سیستم عامل لینوکس داشتم

طبق لینک بالا اکثرا با rebuild کردن یا ریست کردن دوباره کانتینر مشکلشون رو حل کردن.

من سایت دیگه ای رو هم به همین صورت بالا آورده بودم و تا الان چنین مشکلی نداشتم. البته برای سایت قبلی مسیر volume از Absolute path استفاده نکرده بودم و مسیر به صورت Relative path بوده،

به نظرتون چه دلیلی باعث این مشکل شده است؟
به نظرتون اگر فایلهای استاتیک رو داخل کانتینر کپی و volume رو حذف بکنم چطور هست؟


#2

کپی کردن فایل ها در کانتینر نمیتونه روش مناسبی باشه،
اما در مورد مشکلی که برای شما هنگام bind کردن پیش میاد باید بگم من هم گاهی در مک همچین مشکلی رو دیدم، اما در لینوکس تا حالا برام پیش نیومده.
یادمه یه جایی به دلیلش بر خودم، سعی می کنم پیداش کنم.


#3

فقط یک سوال! وقتی کانتینرو ریست کردی آیا چه در سیستم میزبان و چه در کانتینر احتمالا از یوزر متفاوتی استفاده نکردی، یا احیانا جایی استفاده sudo رو تغییر ندادی؟
فقط کنجکاو شدم


#4

و یک مورد دیگه اینه که من همیشه در Dockerfile مسیر هایی رو که قراره بایند کنم رو می سازم، یعنی image های من این مسیر رو دارند، شاید به همین دلیل خیلی وقته این مشکل برام پیش نیومده.
مثلا اگر قراره مسیر a از کانتینر به مسیر b در هوست باند بشه، image مربوطه مسیر a رو در کانتینر میسازه.
mkdir a
chown blah a
chmod blah a


#5

فعلا که من کانتینرها رو با docker-compose ران میکنم با دستور sudo هنوز روی حالت swarm نبردم

sudo docker-compose -f nginx_prod.yml -f site1_prod.yml -f site1_dev.yml -f /home/my_user/docker/site2/site2_dev.yml -f network.yml up -d  

برای nginx و elixir از image اصلی استفاده کردم فقط تغییرات کمی دادم توش که مربوط به کاربر اونا نمیشه

منم همه مسیرها رو میسازم و بعد ران میکنم . البته من chown رو فقط زمانی استفاده میکنم که نیاز باشه . چون در حالت نرمال وقتی کانتینر ران شد خود دسترسی ها رو عوض میکنه


#6

در Dockerfile مسیر سازی میکنی؟


#7

خارج از موضوع:
از فرمان زیر استفاده کردی تا حالا؟

docker-compose -f file1 -f file2 config > bigfile.yml

#8

بهتره دسترسی ها در کنترل شما باشه و داکر از root استفاده نکنه


#9

اگر موافقی از موضوع خارج نشیم :laughing:


#10

توی حالت prod اگر بخوام ببرم . همون دایرکتوری های مورد نظرم رو کپی میکنم داخل کانتینر در مسیری که میخوام .

نه چون فایلهایی که دارم رو بیشتر اوقات تغییر میدم . ولی به نظر کار آدم رو راحت تر میکنه :grinning:

خب در image های اصلی معمولا هر سرویس user خودش رو داره . و البته بعضی سرویس ها هستن که نیاز به دسترسی روت دارن برای اجرا شدن ولی بعدا با کاربر خودشون بالا میان مثل آپاچی و انجینکس ولی بعضی سرویسهای دیگه هستن که اگر با root اجرا نشن مشکلات بیشتری پیدا میکنن فکر کنم در مورد redis صدق بکنه قبلا خونده بودم یادم نیست . . برای سرویس های دیگه هم که user خودشون رو دارن مثل postgres یا postfix , dovecot که برای ایمیل هستن


#11

در مورد root کلی گفتم، منظورم اینه که کنترل داشته باشی‌.


#12

توی حالت prod اگر بخوام ببرم . همون دایرکتوری های مورد نظرم رو کپی میکنم داخل کانتینر در مسیری که میخوام .

متوجه نشدم، یعنی فرمان های لینوکس رو برای ساختن مسیر در کانتینر توی Dockerfile داری یا نه؟


#13

زمانیکه بخوام فایلهای پروژه رو ببرم داخل کانتینر به این صورت عمل میکنم

FROM mojtabanaserei/elixir:1.6.4
RUN apk add --no-cache tzdata
ENV TZ Asia/Tehran
ADD prod/api_app/trangell_api_gateway_umbrella /api_app
WORKDIR /api_app

#14

دلیل خاصی هست که در زمان ساختن image بجای COPY از ADD استفاده می کنی؟
بازم فقط از روی کنجکاوی پرسیدم

منظور من از مسیر مثل این بود؛
مثلا فکر کن که یک path برای کانفیگ لازم داری

FROM blah
RUN mkdir -p /var/local/my_files && ...
...

بعد در compose file

volumes:
    - ./here/var:/var/local/my_files

#15

دلیل خاصی نداره نه . فقط چون برای کپی فایل هایی دیگه که لینک بودن از ADD استفاده کرده بودم برای موارد دیگه هم ADD استفاده کردم البته فرق خاصی با هم ندارن ولی بعدا از COPY استفاده میکنم .

خب اکثر کانتینرها برای خودشون مسیر رو ایجاد کردن مثل همین دستوراتی که نوشتین . منم فقط دایرکتوری های خودم رو به اون مسیرها bind میکنم .


#16

من همیشه مسیر ها رو خودم درست می کنم چون سازنده image از کجا میدونه که من چه مسیری نیاز دارم، و این کار باعث شده که اون موردی که در بالا به عنوان مشکل در مودش حرف زدیم برام اتفاق نیوفته. اما خب راستش به هر حال این یک اشکال بنظر میاد که احتمالا داکر هم بعدا حلش میکنه