share - وصولها - ميناء العقبة الحاويات




كيفية تحميل وحدات تخزين المضيف في حاويات عامل ميناء في Dockerfile أثناء الإنشاء (4)

أثناء تشغيل الحاوية ، يتم إنشاء دليل على مضيفك وتثبيته في الحاوية. يمكنك معرفة ما الدليل هذا

$ docker inspect --format "{{ .Volumes }}" <ID>
map[/export:/var/lib/docker/vfs/dir/<VOLUME ID...>]

إذا كنت تريد تحميل دليل من مضيفك داخل الحاوية ، -v استخدام المعلمة -v وتحديد الدليل. في حالتك سيكون هذا:

docker run -v /export:/export data

لذا ، يمكنك استخدام مجلد المضيف داخل الحاوية.

السؤال الأصلي: كيفية استخدام تعليمة VOLUME في Dockerfile؟

تنقيح: التحديث من الإجابة أدناه ، وبالتالي فإن السؤال الفعلي الذي أريد حل - هو كيفية تحميل وحدات التخزين المضيف في حاويات عامل ميناء في Dockerfile أثناء الإنشاء ، أي وجود docker run -v /export:/export القدرة على docker run -v /export:/export خلال docker build .

آخر تحديث: هناك حل الآن. على الرغم من أنها ليست Docker بدقة ، ولكن " أنها تحل جميع نقاط ضعف Dockerfile " ، لذلك أعتقد أنه هو الحل الأمثل. تحقق من إجابتي الأخيرة للحصول على التفاصيل.

تحديث: لذا فإن الجواب هو "غير ممكن". يمكنني قبولها كإجابة لأنني أعرف أن هذه المسألة قد نوقشت على نطاق واسع في https://github.com/docker/docker/issues/3156 . أستطيع أن أفهم أن قابلية النقل هي قضية ذات أهمية قصوى بالنسبة لمطور مطاحن السفن ؛ ولكن كمستخدم للحاويات ، يجب أن أقول إنني أشعر بخيبة أمل كبيرة بشأن هذه الميزة المفقودة. اسمحوا لي أن أختتم حجتي باقتباس من المناقشة المذكورة أعلاه: " أود استخدام Gentoo كصورة أساسية ولكن بالتأكيد لا أريد> 1GB من بيانات شجرة Portage أن تكون في أي من الطبقات بمجرد بناء الصورة. يمكن أن يكون لديك بعض حاويات مضغوطة لطيفة إذا لم يكن لشجرة التحميل الضخمة التي يجب أن تظهر في الصورة أثناء التثبيت. "نعم ، يمكنني استخدام wget أو curl لتنزيل كل ما أحتاجه ، ولكن حقيقة أن مجرد اعتبار قابلية يجبرني الآن على تحميل> 1GB من شجرة Portages في كل مرة أقوم فيها ببناء صورة Gentoo الأساسية ليست فعالة ولا سهلة الاستخدام. علاوة على ذلك ، سوف يكون مستودع الطرد موجودًا تحت / usr / portage ، وبالتالي دائمًا ما يتم نقله تحت Gentoo. مرة أخرى ، أحترم القرار ، ولكن اسمحوا لي أن أعرب عن خيبة أملي في الوقت نفسه. شكر.

السؤال الأصلي بالتفصيل:

من عند

مشاركة الدلائل عبر وحدات التخزين
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/

تقول أن ميزة "وحدات تخزين البيانات" متوفرة منذ الإصدار 1 من Docker Remote API ". بلدي عامل ميناء هو الإصدار 1.2.0 ، لكنني وجدت المثال الوارد في المادة أعلاه لا يعمل:

# BUILD-USING:        docker build -t data .
# RUN-USING:          docker run -name DATA data
FROM          busybox
VOLUME        ["/var/volume1", "/var/volume2"]
CMD           ["/usr/bin/true"]

ما هي الطريقة الصحيحة في Dockerfile لتركيب وحدات التخزين التي شنت المضيف في حاويات عامل ميناء ، عبر الأمر VOLUME؟

$ apt-cache policy lxc-docker
lxc-docker:
  Installed: 1.2.0
  Candidate: 1.2.0
  Version table:
 *** 1.2.0 0
        500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
        100 /var/lib/dpkg/status

$ cat Dockerfile 
FROM          debian:sid

VOLUME        ["/export"]
RUN ls -l /export
CMD ls -l /export

$ docker build -t data .
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon 
Step 0 : FROM          debian:sid
 ---> 77e97a48ce6a
Step 1 : VOLUME        ["/export"]
 ---> Using cache
 ---> 59b69b65a074
Step 2 : RUN ls -l /export
 ---> Running in df43c78d74be
total 0
 ---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
 ---> Running in 8e4916d3e390
 ---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551

$ docker run data
total 0

$ ls -l /export | wc 
     20     162    1131

$ docker -v
Docker version 1.2.0, build fa7b24f

أعتقد أنك تستطيع أن تفعل ما تريد القيام به عن طريق تشغيل البناء عبر أمر عامل ميناء يتم تشغيل نفسه داخل حاوية عامل ميناء. انظر Docker يمكن أن تعمل الآن داخل Docker | مدونة عامل الميناء . تم استخدام تقنية كهذه ، ولكنها في الواقع تم الوصول إلى عامل الترس الخارجي الخارجي من حاوية ، على سبيل المثال ، أثناء استكشاف كيفية إنشاء أصغر حاوية عامل ميناء ممكنة | مدونة Xebia .

مقالة أخرى ذات صلة هي تحسين Docker Images CenturyLink Labs ، التي توضح أنه إذا انتهى بك المطاف إلى تنزيل مواد أثناء الإنشاء ، يمكنك تجنب وجود مساحة تضيعها في الصورة النهائية عن طريق تنزيل التحميل وحذفه وحذفه كلها في خطوة RUN واحدة.


استكمال: شخص ما لن يأخذ أي جواب ، وأنا أحب ذلك ، إلى حد كبير ، وخاصة لهذا السؤال بالذات.

أخبار جيدة ، هناك طريقة الآن -

الحل هو الروك: https://github.com/grammarly/rocker

said جون ياني ، "IMO ، أنه يحل جميع نقاط ضعف Dockerfile ، مما يجعلها مناسبة للتنمية".

المهزة

https://github.com/grammarly/rocker

من خلال تقديم أوامر جديدة ، يهدف Rocker إلى حل حالات الاستخدام التالية ، والتي هي مؤلمة مع Docker العادي:

  1. تحميل وحدات تخزين قابلة لإعادة الاستخدام في مرحلة الإنشاء ، لذلك قد تستخدم أدوات إدارة التبعية ذاكرة التخزين المؤقت بين الإصدارات.
  2. مشاركة مفاتيح سه مع بناء (لسحب repos الخاصة ، وما إلى ذلك) ، في حين لا تتركها في الصورة الناتجة.
  3. بناء وتشغيل التطبيق في صور مختلفة ، تكون قادرة على تمرير قطعة أثرية بسهولة من صورة واحدة إلى أخرى ، من الناحية المثالية يكون هذا المنطق في Dockerfile واحد.
  4. العلامة / الصور دفع الحق من Dockerfiles.
  5. تمرير المتغيرات من أمر بناء قذيفة بحيث يمكن استبدالها إلى Dockerfile.

و اكثر. هذه هي أهم القضايا التي تمنع اعتمادنا لشركة Docker في Grammarly.


توجد طريقة لتحميل وحدة تخزين أثناء الإنشاء ، ولكنها لا تتضمن Dockerfiles.

تتمثل التقنية في إنشاء حاوية من أي قاعدة ترغب في استخدامها (تركيب وحدة التخزين الخاصة بك في الحاوية مع الخيار -v ) ، وتشغيل نص برمجي خاص بشفرة للقيام بعمل بناء الصور ، ثم ارتكاب الحاوية كصورة عند الانتهاء.

لن يؤدي هذا فقط إلى استبعاد الملفات الزائدة التي لا تريدها (وهذا أمر جيد للملفات الآمنة أيضًا ، مثل ملفات SSH) ، كما أنه ينشئ أيضًا صورة واحدة. يحتوي على جوانب سلبية: لا يعتمد أمر الالتزام كل تعليمات Dockerfile ، ولا يسمح لك بالتقاط عند تركه إذا كنت تحتاج إلى تحرير البرنامج النصي الخاص بك.