Shinyproxy: Melewati kredensial SQL saat runtime dengan aplikasi glossyproxy.yml

Dibuat pada 27 Okt 2020  ·  5Komentar  ·  Sumber: openanalytics/shinyproxy

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!

question

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 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 )

Semua 5 komentar

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!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat