Compose: استخدام أمر shell في docker-compose.yml

تم إنشاؤها على ٢٧ أكتوبر ٢٠١٦  ·  41تعليقات  ·  مصدر: docker/compose

مرحبًا ، هل هناك طريقة لاستخدام أوامر shell في ملف docker-compose.yml ؟
ها هي حالة الاستخدام الخاصة بي:

 version: '2'
 services:
   ci:
     image: jenkins
     volumes:
       - ./data:/var/jenkins_home
       - /var/run/docker.sock:/var/run/docker.sock
       - $(command -v docker):/usr/bin/docker
     groupadd:
       - $(stat -c %g /var/run/docker.sock)
     ports:
       - "8080:8080"
       - "50000:50000"

هذا الخطأ يعطيني حاليًا:

ERROR: Invalid interpolation format for "volumes" option in service "ci": "${command -v docker}:/usr/bin/docker"
kinquestion

التعليق الأكثر فائدة

سيكون هذا مفيدًا جدًا أن يكون لديك ....

ال 41 كومينتر

مرحبًا zkanda ،

آسف ، هذا ليس شيئًا ندعمه. عادة ، يتم ذلك عن طريق تعيين متغيرات البيئة واستخدام الاستبدال المتغير داخل ملف الإنشاء بدلاً من ذلك.

@ shin- شكرًا ، يمكنني إيجاد حل بديل لمتغيرات البيئة. يبدو أيضًا .env مفيدًا جدًا أيضًا.
المستندات ذات الصلة: https://docs.docker.com/compose/environment-variables/#/the -env-file

zkanda هل سبق لك أن حصلت على هذا للعمل ، لقد حاولت في ملفي .env

DOCKER_BIN=`which docker`

ثم في docker-compose.yml

jenkinsmaster:
  build: jenkins-master
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ${DOCKER_BIN}:/usr/bin/docker
  ports:
    - "50000:50000"

لكني أستمر في الحصول على

Cannot create container for service jenkinsmaster: create `which docker`: "`which docker`" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.

لذا يبدو أنه يتم تفسير الأوامر على أنها سلاسل في الملف .env ؟

لا يتم توسيع الأوامر بواسطة Compose ، في .env أو في أي مكان آخر.

سيكون هذا مفيدًا جدًا أن يكون لديك ....

+1

إليك حالة استخدام. عند إعداد كافكا ، فإنه يحتاج إلى IP الخاص بالجهاز المضيف. لدي البرنامج النصي التالي للحصول على ذلك بالنسبة لي:

DOCKER_HOST_IP=$(ifconfig | grep 'inet .*br' | sed -E 's/.*inet (.*) netmask.*/\1/')

أشير إلى أن الملكية الفكرية في البيئة. لا يمكنني تشغيل docker-compose up بعد الآن لأنني بحاجة إلى تشغيل ذلك مسبقًا. وأحتاج إلى إبلاغ المطورين الآخرين في الفريق بهذا.

+1

سيكون من المفيد الحصول على المستخدم الحالي ، كما في:

services:
  foo:
    image: bar:latest
    user: ${CURRENT_USER-$(id -u):$(id -g)}

يجب أن تكون هناك حالات استخدام أخرى أيضًا ...

بالمناسبة ، لا أفهم حقيقة أن ${BAZ-default} يعمل في Compose إذا لم نتمكن من تنفيذ باقي وظائف Bash ... (على حد علمي ، - هي إحدى وظائف التلاعب المتغيرة في Bash ، كبديل بـ ${VAR/search/replace} ، على سبيل المثال)

نعم @ davi5e ... ما كنت أحاول من أجله:

version: "3.7"

services:
  orchestrator:
    build: .
    ports:
      - "2000:2000"
    # Use type host until we can test link
    network_mode: "host"
    environment:
      - NODE_ENV=development
      - LOCAL_USER_ID=${id -u}

@ davi5e حالة استخدام أخرى عندما تريد إنشاء وحدة تخزين

+1
الرجاء إعادة فتح المشكلة

+1
حالة الاستخدام الخاصة بي لنشر مجموعة من المنافذ التي تم تحديدها كدالة للمنفذ "الأساسي"

سيكون هذا مفيدًا جدًا لإعداد متغيرات UID / GID لأن هذا إلى حد كبير مطلب لاستخدام Docker في بيئة تطوير (دون الحاجة إلى استخدام البرامج النصية لتعيين هذا في ملف env.).

+1

يمكن استخدام هذا لتسمية / وضع علامة على الصور التي تم إنشاؤها بواسطة عامل ميناء يؤلف بعلامة git وتثبيت التجزئة:

في .env :

GIT_VERSION=$(git describe --always --dirty --abbrev)
OUTER_PORT=6970

في docer-complse.yml :

version: '3'
services:
  nginx:
    restart: always
    build:
        context: ./nginx
        labels:
          org.label-schema.schema-version: "1.0"
          org.label-schema.version: "${GIT_VERSION}"
          org.lavel.schema.url: "https://mydocu-server.company.com/vcs/${GIT_VERSION}"
    ports:
      - ${OUTER_PORT}:8080

بالنسبة لأولئك الذين يقومون بهذا في التطوير ، إذا كانت قوقعتك تحدد المتغير UID ، فيمكنك تمرير ذلك عند بناء صورة التطوير المحلي. نظرًا لعدم مشاركة صورة التطوير المحلي ، فلا داعي للقلق بشأن تعارضات الموائع مع زملائك في العمل.

+1

@ con-f-use القيام بذلك سيؤدي فقط إلى إرسال الأمر الفعلي وليس النتيجة من الاختبار الذي أجريته ، فإن الاختراق الوحيد الذي نجحت فيه حتى الآن هو كتابة نص برمجي التفاف عامل التحميل الذي يقوم بإعداد متغير البيئة.

+1

TL ؛ DR إذا كنت تريد تصدير هذه المتغيرات من ملف .env :

# set the path of .env file here
ENV_FILE="${ENV_FILE:-local.env}"
while IFS= read -r line; do
  export "$line"
done < <( grep --color=never -E -v -e '^#' -e '^[[:space:]]*$' "${ENV_FILE}" )

كيف تستعمل:

  • اكتبه في سطر الأوامر واضغط على Enter لتعديل بيئة shell الحالية

أو

  • احفظه كبرنامج نصي باش ومصدره

تحفظات:

  • لن يؤدي حفظ هذا كبرنامج نصي وتشغيله إلى تصدير هذه المتغيرات بطريقة سحرية في بيئة الصدفة الحالية. سيتعين عليك الحصول عليها أو القيام ببعض الهوى eval .
  • (ربما شيء جيد؟) ستحل محل المتغيرات الموجودة بنفس الاسم في $ENV_FILE

الشرح: هنا

ألق نظرة على direnv لأتمتة كل ذلك https://direnv.net/

في الجمعة 28 يونيو 2019 ، الساعة 12:57 مساءً Sudarshan Wadkar [email protected]
كتب:

TL ؛ DR إذا كنت تريد تصدير هذه المتغيرات من ملف env.

اضبط مسار ملف .env هنا

ENV_FILE = "$ {ENV_ FILE: -local.env }" بينما IFS = read -r line ؛ فعل
تم تصدير "$ line" <<(grep --color = never -E -v -e '^ #' -e '^ [[: space:]] * $' "$ {ENV_FILE}")

كيف تستعمل:

  • اكتبه في سطر الأوامر الخاص بك
  • احفظه كبرنامج نصي باش ومصدره

تحفظات:

  • لن يؤدي حفظ هذا كبرنامج نصي وتشغيله إلى تصديرها بطريقة سحرية
    المتغيرات في بيئة الصدفة الحالية. سيكون عليك الحصول عليها أو القيام بها
    بعض التقييم الهوى.
  • (ربما شيء جيد؟) سيحل محل المتغيرات الموجودة بنفس الشيء
    الاسم باللغة $ ENV_FILE

الشرح: هنا
https://explainshell.com/explain؟cmd= while+IFS٪3D+read+-r+line٪3B+do+export+٪22٪24line٪22٪3B+done+٪3C+٪3C٪28grep+--color٪3Dno+ -v + -e +٪ 27٪ 5E٪ 23٪ 27 + -e +٪ 27٪ 5E٪ 5B٪ 5B٪ 3 مساحة٪ 3A٪ 5D٪ 5D *٪ 24٪ 27 +٪ 24٪ 7BENV_FILE٪ 7D٪ 29

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/4081؟email_source=notifications&email_token=AACHRDBQXQZTC5FXTOFL6UTP4XOBJA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACHRDGJ6 FAQBEDLBSRVS6TP4XOBJANCNFSM4CUISSSA
.

نعم ، direnv جميل لكني لست متأكدًا مما إذا كان سيكون مفيدًا مع ملف Docker's .env الذي يحتوي على خطوط بسيطة مع بناء جملة بسيط VAR=VAL (حسب هذا الرابط.) فكرة كونها ملف .env ملتزمة بالمستودع ويمكن أن يقوم البرنامج النصي للبناء بتشغيله على بلدي المحلي أو docker-compose يمكن تشغيله على مرحلة / نشر.

لا توجد بالفعل متغيرات البيئة
https://en.wikipedia.org/wiki/Environment_variable إذا كانوا جزءًا من
قاعدة الشفرة وليست جزءًا من البيئة ...

يوم الجمعة 28 يونيو 2019 الساعة 2:04 مساءً Sudarshan Wadkar [email protected]
كتب:

نعم ، direnv جميل لكني لست متأكدًا مما إذا كان سيكون مفيدًا مع Docker
ملف .env الذي يحتوي على أسطر بسيطة مع VAR عادي = VAL بناء الجملة (حسب هذا
https://docs.docker.com/compose/env-file/#syntax-rules رابط.) الفكرة
يجري ملف .env ملتزمًا بالمستودع ويمكن بناء البرنامج النصي
تشغيله على بلدي المحلي أو عامل إنشاء يمكن تشغيله على التدريج / النشر.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/4081؟email_source=notifications&email_token=AACHRDCEKOMK2VI3A43QBC3P4XV5BA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNM66
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACHRDF3Q3YOZPHUIUZYEPTP4XV5BANCNFSM4CUISSSA
.

حسنا.

أحب أن أعتقد أن الملف .env يتحول إلى متغير بيئة عند تنفيذ docker-compose up .

كانت حالة الاستخدام الخاصة بي هي استخدام نفس الملف .env كمصدر للحقيقة لتشغيل مثيل مطور محلي (ربما بدون مساعدة docker-compose ). حسنًا ، ربما لا تكون هذه الأسطر الموجودة في الملف .env متغيرات بيئة بالفعل ، لكنها بالتأكيد تتحول إلى متغير واحد عند النشر.

ما زلت لا أرى كيف سيساعد direnv في هذه الحالة.

حالة استخدام أخرى هي وضع أمر ينشئ كلمة مرور تعينها لـ env var في الحاوية.
بهذه الطريقة ، لن تتم كتابة كلمة المرور في ملفات .env أو docker-compose.yml.

أعتقد أن هذا سيكون مفيدًا جدًا للعديد من حالات الاستخدام المتعلقة بالأمان.

+1

+1

1+ ، سيكون مفيدًا بشكل كبير لإعداد uid و gid بدون تعقيد الحل

""
/ _ / \
(س س)

^ <``

+1 لدي حالة استخدام كما هو مذكور أعلاه لإضافة فرع git والالتزام في ملف الإنشاء الذي سينتقل في النهاية إلى ملف dockerfile ثم يتم إضافته كإصدار في بيان الجرة المدمج في مرحلة من عملية بناء عامل ميناء متعدد المراحل .

  gateway:
    image: name
    build:
      context: ./project
      dockerfile: build/Dockerfile
      args:
        - GIT_COMMIT=${$(git rev-list -1 HEAD):-unspecified}
        - GIT_DATE=${$(git log -1 --date=short --pretty=format:%ct):-unspecified}

لذلك ، حاليًا ، بالنسبة لـ 7 مشاريع في ملف الإنشاء الخاص بي ، يتعين علي تعيين بيئات 7 × 2. حزين.

@ shin- هل يمكنك إعادة فتح هذا كطلب ميزة؟ يبدو أنه لم يتم حلها من خلال حلول عمل لطيفة وهناك حاجة ماسة لذلك.

+1 ربما كان من الممكن تحقيق ذلك بطريقة مختلفة ، لكنني كنت بحاجة إلى إشراك محرك عامل الإرساء من داخل حاوية لإعادة تشغيل حاوية مجاورة. في حالة انتهاء صلاحية شهادة Letsencrypt الخاصة بي ، لكنني بحاجة إلى إعادة تشغيل حاوية NGinx بعد التجديد. المشكلة هي ، كيف يمكنني إخبار عامل الإرساء - إنشاء داخل الحاوية باسم المشروع لهذه المجموعة من الحاويات؟ PROJECT=(basedir ~+) . تم ترميزه يدويًا في الوقت الحالي :(

+1 لطلب الميزة هذا
حالة استخدام أخرى هي انتزاع الأسرار من cli / http (مثل vault ، 1Password) والتوصيل بالبيئة.
بمعنى آخر

...
    environment:
      - SERVICE_USERNAME=$(vault kv get -field=username kv/service/credentials)
      - SERVICE_PASSWORD=$(vault kv get -field=password kv/service/credentials)
...

لدي نفس الحاجة مثل rafaelbattesti ، إلا أنني أستخدم lastpass.

...
     environment:
         - TRPASSWD=$(lpass show --password Transmission)
....

+1

+1

@ shin- هل يمكنك إعادة فتح هذا كطلب ميزة؟ يبدو أنه لم يتم حلها من خلال حلول عمل لطيفة وهناك حاجة ماسة لذلك.

@ four43 ، ربما @ shin- أو لا يقرأ الآخرون التعليقات على القضايا المغلقة؟ هل نفتح واحدة أخرى لجذب الانتباه؟

سيكون التوسيع المتغير في ملف إنشاء عامل ميناء ميزة مفيدة جدًا للحصول على ...

+1

esale - نعم أعتقد أنه نوع من يعتمد. أستطيع أن أرى أنه خارج نطاق هذه الحالة. لا تفرط في استخدام بعض DSL كثيرًا. في تلك المرحلة ، يكون ملف إنشاء عامل ميناء باستخدام بعض الأدوات الأخرى؟ هل نتخطى الهموم أكثر من اللازم؟

إذا كنت تستخدم ملف .env ، فيمكنك استبدال إخراج shell بأمر مثل هذا

eval "echo \"$(cat .env.example)\"" > .env

مثال ملف env.example

DOCKER_BIN=$(which docker)
DOCKER_COMPOSE_BIN=$(which docker-compose)

قم بإنشاء ملف .env

DOCKER_BIN=/snap/bin/docker
DOCKER_COMPOSE_BIN=/snap/bin/docker-compose
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات