Hai,
Saya memiliki aplikasi glossyproxy yang berfungsi dengan otentikasi ldap. Namun, untuk mengambil data dari database SQL saya sekarang menggunakan (tidak disarankan) connectionstring hardcoded dalam kode R saya dengan kredensial yang disebutkan di sini (saya menggunakan pengguna layanan karena pengguna akhir saya tidak memiliki izin untuk menanyakan database):
con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = 'Driver={Driver};Server=Server;Database=dbb;UID=UID;PWD=PWD')
Saya mencoba mengganti string koneksi ini dengan variabel lingkungan, yang saya berikan dari Host linux saya ke wadah. Kode R sekarang berubah menjadi:
connString <- Sys.getenv("CONNSTRING")
connString <- sub("\\\\","\\", connString)
con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = connString)
Ini berfungsi dengan baik saat menjalankan wadah di luar ShinyProxy, dan dengan demikian dengan meneruskan variabel lingkungan saat runtime dengan perintah buruh pelabuhan berikut:
docker run -it --env-file .env.list app123
Variabel lingkungan juga ditemukan saat memasuki wadah yang sedang berjalan dan mengetik 'env'.
Namun, ketika menggunakan ShinyProxy, tidak jelas bagi saya bagaimana mengonfigurasi ini di file konfigurasi yaml dan di bash-command saat runtime. Bagaimana cara menentukan parameter container-env-file untuk container aplikasi? Dan bagaimana cara menyampaikan pernyataan --env-file .env.list saat runtime sehingga diambil dalam wadah yang ditautkan?
Yaml aplikasi saya sekarang terlihat seperti ini (saya sengaja membiarkan konfigurasi ldap kosong):
proxy:
port: 8080
authentication: ldap
admin-groups: admins
ldap:
url: url
manager-dn: manager-dn
manager-password: manager-password
user-search-base: user-search-base
user-search-filter: user-search-filter
group-search-filter: group-search-filter
group-search-base: group-search-base
docker:
internal-networking: true
specs:
- id: 01_ok
display-name: dashboard
description: Dashboard
container-cmd: ["R", "-e", "shiny::runApp('/root/R')"]
container-image: hberten/app123
container-env-file: .env.list
container-network: shineyproxyn-net
access-groups: [GG_APP_ShinyProxy]
logging:
file:
shinyproxy.log
Saya kemudian menjalankan perintah berikut untuk memulai wadah ShinyProxy:
sudo docker run -d --env-file ~/.env.list -v /var/run/docker.sock:/var/run/docker.sock --net shineyproxyn-net -p 8080:8080 hberten/shinyproxy
Masalah terkait ditemukan di sini , tetapi yang ini menggunakan compose.yml Docker. Apakah mungkin untuk mengonfigurasi berbagai hal tanpa Docker Compose? Apa yang saya lewatkan?
Bantuan apa pun sangat dihargai!
Hai @Bertusian ,
Saya pikir masalahnya adalah Anda menjalankan glossyproxy itu sendiri dalam sebuah wadah, jadi Anda perlu membuat file .env.list
tersedia di dalam wadah itu (dengan memasang volume), atau sebagai alternatif gunakan container-env
dengan env vars yang Anda lewati melalui file di perintah docker run Anda. Selain itu, saya percaya bahwa container-env-file
mengharapkan jalur absolut.
Hai @mnazarov.
Memang, saya menjalankan glossyproxy dalam sebuah wadah. Bisakah Anda akhirnya memberikan contoh perintah runtime untuk meluncurkan wadah glossyproxy (dengan .env.list volume terpasang), dan apakah itu kemudian ditangkap oleh wadah R-app? Saya pikir .env.list dibuat tersedia dengan menambahkan --env-file ~/.env.list (yang berfungsi saat menjalankan wadah tanpa glossyproxy).
Dan apakah saya masih perlu mengadaptasi application.yml? Masih belum terlalu jelas bagi saya. Terima kasih atas bantuan atau contoh apa pun ...
Saya akan mencoba menjelaskan lebih jelas: Anda memiliki sistem Host dan 2 wadah: satu di luar tempat shineproxy berjalan dan satu di dalam dengan aplikasi Anda.
Dengan menjalankan docker run --env-file ...
pada sistem host Anda, Anda membuat variabel lingkungan dari file tersebut pada sistem host tersedia untuk wadah luar sebagai env vars. Sekarang Anda dapat meneruskannya lebih jauh ke wadah dalam menggunakan variabel container-env
.
Atau Anda dapat memasang folder Host dengan file Anda ke dalam wadah luar Anda, dan kemudian Anda dapat membuat env vars dari file itu tersedia di wadah dalam Anda dengan menggunakan variabel container-env-file
.
Contoh perintah untuk alternatif ke-2 mungkin seperti:
sudo docker run -d -v /home/envs:/tmp/envs -v /var/run/docker.sock:/var/run/docker.sock --net shineyproxyn-net -p 8080:8080 hberten/shinyproxy
dengan asumsi file .env.list Anda terletak di /home/envs/ pada host Anda - Anda membuatnya tersedia di wadah luar di bawah /tmp/envs/env.list dengan volume mount - sekarang Anda dapat menggunakan container-env-file: /tmp/envs/.env.list
di aplikasi Anda.yml
Contoh untuk alternatif pertama adalah menggunakan perintah asli Anda, dan kemudian di application.yaml gunakan container-env
dengan sesuatu seperti:
container-env:
VAR11: "${VAR1}"
VAR22: "${VAR2}"
di mana VAR1 dan VAR2 adalah env vars yang didefinisikan dalam file di host dan karenanya tersedia sebagai env vars di wadah luar, dan di sini Anda meneruskannya ke wadah dalam sebagai VAR11 dan VAR22 (misalnya, Anda tentu saja dapat menggunakan nama yang sama juga )
YA TUHAN. Ini bagus! Sekarang bekerja. Saya belum mencoba saran pertama (tetapi akan melakukannya nanti), tetapi solusi kedua Anda melakukannya dengan benar! Saya tahu saya dekat, tetapi tidak dapat menemukannya.
Terima kasih banyak!!
Hal-hal hebat yang kalian lakukan dengan ShinyProxy.
Saya senang itu berhasil!
Komentar yang paling membantu
Saya akan mencoba menjelaskan lebih jelas: Anda memiliki sistem Host dan 2 wadah: satu di luar tempat shineproxy berjalan dan satu di dalam dengan aplikasi Anda.
Dengan menjalankan
docker run --env-file ...
pada sistem host Anda, Anda membuat variabel lingkungan dari file tersebut pada sistem host tersedia untuk wadah luar sebagai env vars. Sekarang Anda dapat meneruskannya lebih jauh ke wadah dalam menggunakan variabelcontainer-env
.Atau Anda dapat memasang folder Host dengan file Anda ke dalam wadah luar Anda, dan kemudian Anda dapat membuat env vars dari file itu tersedia di wadah dalam Anda dengan menggunakan variabel
container-env-file
.Contoh perintah untuk alternatif ke-2 mungkin seperti:
dengan asumsi file .env.list Anda terletak di /home/envs/ pada host Anda - Anda membuatnya tersedia di wadah luar di bawah /tmp/envs/env.list dengan volume mount - sekarang Anda dapat menggunakan
container-env-file: /tmp/envs/.env.list
di aplikasi Anda.ymlContoh untuk alternatif pertama adalah menggunakan perintah asli Anda, dan kemudian di application.yaml gunakan
container-env
dengan sesuatu seperti:di mana VAR1 dan VAR2 adalah env vars yang didefinisikan dalam file di host dan karenanya tersedia sebagai env vars di wadah luar, dan di sini Anda meneruskannya ke wadah dalam sebagai VAR11 dan VAR22 (misalnya, Anda tentu saja dapat menggunakan nama yang sama juga )