Compose: Menggunakan perintah shell di docker-compose.yml

Dibuat pada 27 Okt 2016  ·  41Komentar  ·  Sumber: docker/compose

Halo, apakah ada cara untuk menggunakan perintah shell di file docker-compose.yml ?
Ini kasus penggunaan saya:

 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"

Saat ini memberi saya kesalahan ini:

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

Komentar yang paling membantu

Ini akan sangat berguna untuk memiliki ....

Semua 41 komentar

Hai @kamu_lucu ,

Maaf, ini bukan sesuatu yang kami dukung. Biasanya, ini dilakukan dengan menyetel variabel lingkungan dan menggunakan substitusi variabel di dalam file Tulis sebagai gantinya.

@ shin- terima kasih, saya dapat mengatasi masalah dengan variabel lingkungan. Juga .env tampaknya sangat berguna juga.
Dokumen yang relevan: https://docs.docker.com/compose/environment-variables/#/the -env-file

@zkanda apakah Anda pernah membuat ini berfungsi, saya mencoba di file .env

DOCKER_BIN=`which docker`

dan kemudian di docker-compose.yml

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

Tapi saya terus mendapatkannya

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.

Jadi sepertinya perintah diartikan sebagai string dalam file .env ?

Perintah tidak diperluas oleh Tulis, di .env atau di tempat lain.

Ini akan sangat berguna untuk memiliki ....

+1

Berikut kasus penggunaan. Saat menyiapkan Kafka, ia membutuhkan IP mesin host. Saya memiliki skrip berikut untuk mendapatkannya untuk saya:

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

Saya mereferensikan IP itu di env. Saya tidak bisa menjalankan docker-compose up lagi karena saya harus menjalankannya sebelumnya. Dan saya perlu memberi tahu pengembang lain di tim tentang hal ini.

+1

Akan berguna untuk mendapatkan pengguna saat ini, seperti:

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

Harus ada kasus penggunaan lain juga ...

Ngomong-ngomong, saya tidak mengerti fakta bahwa ${BAZ-default} berfungsi di Compose jika kami tidak dapat mengeksekusi sisa fungsi Bash ... (sejauh yang saya tahu, - adalah salah satu fungsi manipulasi variabel Bash, sebagai substitusi dengan ${VAR/search/replace} , misalnya)

Ya @ davi5e ... Yang saya coba:

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 kasus penggunaan lainnya adalah ketika Anda ingin membuat volume buruh pelabuhan dan menautkannya ke direktori repositori git. Pemandian mutlak ini akan mewaspadai setiap pengembang di tim.

+1
Tolong buka kembali masalahnya

+1
kasus penggunaan saya untuk mempublikasikan berbagai port yang ditentukan sebagai fungsi dari port "dasar"

Ini akan sangat berguna untuk mengatur variabel UID / GID karena ini cukup banyak persyaratan untuk menggunakan Docker dalam lingkungan pengembangan (tanpa perlu menggunakan skrip untuk mengatur ini ke dalam file .env).

+1

Bisa menggunakan ini untuk memberi label / memberi tag pada gambar yang dihasilkan oleh pekerja galangan menulis dengan tag git dan melakukan hash:

Di .env :

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

Di 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

Bagi mereka yang melakukan ini dalam pengembangan, jika shell Anda menyetel variabel UID , Anda dapat meneruskannya saat membuat gambar pengembangan lokal. Karena gambar pengembangan lokal tidak dibagikan, Anda tidak perlu khawatir tentang konflik uid dengan rekan kerja Anda.

+1

@ con-f-use Melakukan hal itu hanya akan mengirimkan perintah yang sebenarnya dan bukan hasil dari pengujian saya, satu-satunya peretasan yang saya berhasil sejauh ini adalah menulis sebuah script wrapping docker compose yang mengatur variabel lingkungan.

+1

TL; DR jika Anda ingin mengekspor variabel tersebut dari .env file:

# 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}" )

Cara Penggunaan:

  • Ketik di baris perintah Anda dan tekan enter untuk mengubah lingkungan shell Anda saat ini

ATAU

  • Simpan sebagai skrip bash dan ambil sumbernya

Peringatan:

  • Menyimpan ini sebagai skrip dan menjalankannya tidak akan secara ajaib mengekspor variabel tersebut di lingkungan shell Anda saat ini. Anda harus mendapatkannya atau melakukan eval .
  • (Mungkin bagus?) Ini akan menimpa variabel yang ada dengan nama yang sama di $ENV_FILE

Penjelasan: di sini

Lihat direnv untuk mengotomatiskan semua itu https://direnv.net/

Pada Jum, 28 Jun 2019, 12.57 Sudarshan Wadkar [email protected]
menulis:

TL; DR jika Anda ingin mengekspor variabel tersebut dari file .env:

setel jalur file .env di sini

ENV_FILE = "$ {ENV_ FILE: -local.env }" sedangkan IFS = read -r line; melakukan
ekspor "$ line" selesai <<(grep --color = never -E -v -e '^ #' -e '^ [[: space:]] * $' "$ {ENV_FILE}")

Cara Penggunaan:

  • Ketik di baris perintah Anda
  • Simpan sebagai skrip bash dan ambil sumbernya

Peringatan:

  • Menyimpan ini sebagai skrip dan menjalankannya tidak akan secara ajaib mengekspornya
    variabel di lingkungan shell Anda saat ini. Anda harus mencari atau melakukannya
    beberapa eval mewah.
  • (Mungkin hal yang baik?) Ini akan menimpa variabel yang ada dengan yang sama
    nama di $ ENV_FILE

Penjelasan: di sini
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% 3Aspace% 3A% 5D% 5D *% 24% 27 +% 24% 7BENV_FILE% 7D% 29

-
Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDBQXQZTC5FXTOFL6UTP4XOBJA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63ZGLOPVREXG43VMVBW63ZGLOPVYZG43
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACHRDGJ6FAQBEDLBSRVS6TP4XOBJANCNFSM4CUISSSA
.

Ya, direnv bagus tapi saya tidak yakin apakah itu akan berguna dengan file .env Docker yang memiliki baris sederhana dengan sintaks VAR=VAL (sesuai tautan ini .) Ide menjadi .env file dikomit ke repositori dan skrip build dapat menjalankannya di lokal saya atau docker-compose dapat menjalankannya di staging / deploy.

Tidak ada variabel lingkungan yang sebenarnya
https://en.wikipedia.org/wiki/Environment_variable jika mereka adalah bagian dari
basis kode dan bukan bagian dari lingkungan ...

Pada Jum, 28 Jun 2019 pukul 14.04 Sudarshan Wadkar [email protected]
menulis:

Ya, direnv bagus tapi saya tidak yakin apakah itu akan berguna dengan Docker
File .env yang memiliki baris sederhana dengan sintaks VAR = VAL biasa (sesuai ini
https://docs.docker.com/compose/env-file/#syntax-rules tautan.) Ide
sedang file .env dikomit ke repositori dan skrip build bisa
menjalankannya di local saya atau docker-compose dapat menjalankannya di staging / deploy.

-
Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDCEKOMK2VI3A43QBC3P4XV5BA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVVREXG43VMVBW6ZGLOFVYK3NVFWX5ZGDFXG43
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACHRDF3Q3YOZPHUIUZYEPTP4XV5BANCNFSM4CUISSSA
.

Oh baiklah.

Saya suka berpikir bahwa file .env berubah menjadi variabel lingkungan ketika Anda mengeksekusi docker-compose up .

Kasus penggunaan saya adalah menggunakan file .env sama sebagai sumber kebenaran untuk menjalankan instance dev lokal (mungkin tanpa bantuan docker-compose ). Jadi ya, mungkin baris di file .env sebenarnya bukan variabel lingkungan, tetapi pasti berubah menjadi satu saat Anda menerapkan.

Saya masih tidak melihat bagaimana direnv akan membantu dalam kasus itu.

Kasus penggunaan lain adalah untuk meletakkan perintah yang menghasilkan kata sandi yang menetapkannya ke env var di wadah.
Dengan cara ini kata sandi sebenarnya tidak akan ditulis dalam file .env atau docker-compose.yml.

Saya pikir ini akan menjadi keuntungan besar bagi banyak kasus penggunaan terkait keamanan.

+1

+1

+1, akan sangat berguna untuk menyetel uid dan gid tanpa memperumit solusi

``
/ _ / \
(oo)

^ <``

+1 Saya memiliki kasus penggunaan seperti yang disebutkan di atas untuk menambahkan git branch dan berkomitmen di file compose yang pada akhirnya akan masuk ke dockerfile dan kemudian ditambahkan sebagai versi dalam manifest dari jar yang dibangun dalam tahap proses pembuatan buruh pelabuhan multistage .

  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}

Jadi, saat ini, untuk 7 proyek di file tulis saya, saya harus menyetel lingkungan 7x2. Sedih.

@ shin- Bisakah Anda membuka ini kembali sebagai permintaan fitur? Sepertinya itu belum diselesaikan dengan solusi yang bagus dan ada kebutuhan yang kuat untuk itu.

+1 Mungkin bisa mencapai ini dengan cara yang berbeda, tetapi saya perlu menggunakan mesin buruh pelabuhan dari dalam wadah untuk mem-boot ulang wadah tetangga. Dalam kasus di mana sertifikat Letsencrypt saya kedaluwarsa, tetapi saya harus memulai ulang penampung NGinx setelah pembaruan. Masalahnya, bagaimana cara memberi tahu docker-compose di dalam container apa nama proyek untuk grup container ini? PROJECT=(basedir ~+) . Ini dikodekan secara manual untuk saat ini :(

+1 untuk permintaan fitur itu
Kasus penggunaan lainnya adalah mengambil rahasia dari cli / http (misalnya vault, 1Password) dan menyambungkannya ke lingkungan.
yaitu

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

Saya memiliki kebutuhan yang sama dengan @rafaelbattesti , kecuali saya menggunakan lastpass.

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

+1

+1

@ shin- Bisakah Anda membuka ini kembali sebagai permintaan fitur? Sepertinya itu belum diselesaikan dengan solusi yang bagus dan ada kebutuhan yang kuat untuk itu.

@ four43 , mungkin @ shin- atau orang lain tidak membaca komentar tentang masalah tertutup? Haruskah kita membuka satu sama lain untuk mendapatkan perhatian?

Perluasan variabel dalam file docker-compose akan menjadi fitur yang sangat berguna untuk dimiliki ...

+1

@esale - Ya saya rasa itu tergantung. Saya bisa melihatnya berada di luar ruang lingkup untuk kasus ini. Jangan berlebihan pada beberapa DSL terlalu banyak. Lalu buat template file docker-compose dengan alat lain? Apakah kita terlalu banyak menyampaikan kekhawatiran?

Jika Anda menggunakan file .env, Anda dapat mengganti output shell dengan perintah seperti ini

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

Contoh file .env.example

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

Buat file .env

DOCKER_BIN=/snap/bin/docker
DOCKER_COMPOSE_BIN=/snap/bin/docker-compose
Apakah halaman ini membantu?
0 / 5 - 0 peringkat