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"
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:
ATAU
Peringatan:
eval
.$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-
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
Komentar yang paling membantu
Ini akan sangat berguna untuk memiliki ....