فشل إعادة بناء المشغل مع Docker 19.03.0 بسبب معلمة الشبكة في Docker

مع إصدار Docker للإصدار 19.03.0، فشل مُشغّل Discourse الآن في تشغيل المثيل بعد إعادة البناء مع الرسالة التالية:

/usr/bin/docker: --network ليس عنوان MAC صالحًا.
راجع '/usr/bin/docker run --help'.

هذا هو الأمر الذي تم تنفيذه (تم تعديل بعض العناصر لأسباب أمنية):

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=2 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e DISCOURSE_HOSTNAME=discourse.mydomain.com -e VIRTUAL_HOST=discourse.mydomain.com -e DISCOURSE_DEVELOPER_EMAILS=admin@mydomain.com -e DISCOURSE_SMTP_ADDRESS=mail.mydomain.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=discourse@mydomain.com -e DISCOURSE_SMTP_PASSWORD=MySuperDuperPass -h vps-discourse -e DOCKER_HOST_IP=172.17.0.1 --name discourse -t --expose 80 --mac-address --network reverse-proxy --network reverse-proxy local_discourse/discourse /sbin/boot
/usr/bin/docker: --network ليس عنوان MAC صالحًا.
راجع '/usr/bin/docker run --help'.

أنا أستخدم هذا خلف وكيل عكسي (يعمل على شبكة تحمل اسم reverse-proxy). لقد كان يعمل دائمًا حتى اليوم. يبدو أنه يتوقع قيمة عنوان MAC غير مُقدَّمة.

دعنا نرى…

root@endoffice-a:/var/discourse# docker --version
Docker version 19.03.0, build aeac949

لقد قمت للتو بتشغيل ./launcher rebuild app ونجح الأمر:

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=8 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e UNICORN_SIDEKIQ_MAX_RSS=1000 -e DISCOURSE_HOSTNAME=discourse.codinghorror.com -e DISCOURSE_DEVELOPER_EMAILS=jatwood@codinghorror.com -e DISCOURSE_SMTP_ADDRESS=smtp.mailgun.org -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME={redacted} -e DISCOURSE_SMTP_PASSWORD={redacted} -e LETSENCRYPT_ACCOUNT_EMAIL={redacted} -e DISCOURSE_CDN_URL=https://discourse-cdn.codinghorror.com -h endoffice-a-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:72:e3:65:d5:32 local_discourse/app /sbin/boot

لاحظ أن --mac-address يظهر ومُملأ، لكن سطر --network هذا خاص بإعدادك ويختلف عن تثبيت Discourse المستقل القياسي.

@codinghorror هذا كله جيد ورائع، ولكن إذا كان تثبيت standalone القياسي هو الطريقة الوحيدة المفترض أن يعمل بها Discourse، فلماذا توفير دعم لتكوين حاوية yml في ./containers، وتضمين أمثلة على ذلك في ./samples؟ الملف الذي استخدمته معلق بالكامل مع تعليمات التشغيل، وتحديداً هذا الجزء:

# أي حجج إضافية لـ Docker؟
# docker_args:

الشيء الوحيد الذي أستخدمه هو:

docker_args: "--network reverse-proxy"

والذي، مرة أخرى، كان يعمل بشكل ممتاز لمدة عام. لذا، من الواضح أن شيئاً ما قد تغير. يرجى فهم أنني لا أحاول أن أكون متحدياً (سيكون ذلك سخيفاً بعض الشيء بما أنني أطلب المساعدة)، لكنني حقاً أحاول توضيح أنني أستخدم خيارات متاحة من خلال عينات Discourse.

ربما لو فهمت كيف يتم توليد عنوان MAC هذا، فقد يوجهني ذلك إلى مشكلة تتعلق بتغيير البيئة، وهذا ما آمل فيه.

أرى هذا في launcher:

     if [ -z "$SKIP_MAC_ADDRESS" ] ; then
      mac_address="--mac-address $($docker_path run $user_args -i --rm -a stdout -a stderr $image /bin/sh -c "echo $hostname | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'")"
     fi

سأقوم بتحليل الأمر لمعرفة ما إذا كان بإمكاني فهمه.

تحديث: وبالنظر إلى هذا، أرى أنه يمكنني استخدام --skip-mac-address. عند القيام بذلك، يتم تشغيل مثالي بشكل صحيح، لذا يبدو أن العملية التي تحسب عنوان MAC هي المشكلة.

إذن، باختصار. عملية البناء تنجح بغض النظر عن أي شيء، لكن في عملية البناء (./launcher rebuild myinstance)، تفشل الخطوة الأخيرة المتمثلة في تشغيل الحاوية بسبب عدم تعيين عنوان MAC بطريقة ما.

ومع ذلك، يمكنني ببساطة تنفيذ الأمر ./launcher start myinstance بعد ذلك، وعندها يبدأ العمل بشكل صحيح، ويكون عنوان MAC موجودًا أيضًا. الأمر غريب، هذا كل شيء.

أواجه نفس المشكلة.
@codinghorror إليك خطوات إعادة إنتاج المشكلة وسبب محتمل لحل هذه المشكلة العائدة:

خطوات إعادة الإنتاج:

  1. اضبط في تكوين الحاويات (app):
    docker_args: "--network reverse-proxy"
  2. أعد البناء
    ./launcher rebuild app
  3. راقب ظهور الخطأ
    /usr/bin/docker: --network ليس عنوان MAC صالحًا

هذه مشكلة تم إدخالها عبر الالتزام bfc79e7 (GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub)
يتم استدعاء merge_user_args بواسطة set_template_info، لكن set_template_info يُستدعى مرتين عند إعادة البناء (run_run و run_bootstrap)
لذلك، بدلًا من أن يكون user_args يساوي $user_args $docker_args، يصبح لدينا $user_args $docker_args $docker_args

لا يسمح Docker بتكوين نفس الشبكة عدة مرات
docker: تم تحديد الشبكة "reverse-proxy" عدة مرات

شكرًا على التراجع عن هذا الالتزام أو جعل merge_user_args خاليًا من الأثر (idempotent).

شكرًا لك على عملك التحقيقي! :male_detective: @saj يبدو أنك وافقت على ذلك الالتزام إلى جانب @deargle

إليك تصحيح:

بتطبيق هذا التصحيح، وإعداد مفتاح docker_args في تعريف الحاوية، يبدو متجه وسيطات أمر docker run النهائي شيئًا من هذا القبيل:

/usr/bin/docker run --shm-size=512m -d --restart=always -e ... -h saj-launcher-testing-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:07:fa:c6:c4:82 --network foonet local_discourse/app /sbin/boot

رائع! إذن، يسعدني أنني لم أكن أحلم بذلك. شكرًا لكم أيها الأصدقاء على اهتمامكم بهذا الأمر.