2017-07-27 79 views
1

從例子我見過一個可以設置泊塢窗,compose.yml環境變量,像這樣:在泊塢窗創建運行bash的客戶端設置環境變量

services: 
    postgres: 
    image: my_node_app 
    ports: -8080:8080 
    environment: 
     APP_PASSWORD: mypassword 
     ... 

爲了安全起見,我用例需要我從我們有一個bash客戶端服務器獲取密碼:

#!/bin/bash 
get_credential <server> <dev-environment> <role> <key> 

在碼頭工人的文檔,我發現this,它說,我可以在shell環境變量的值傳遞給泊塢窗撰寫。所以我可以運行bash客戶端來獲取創建docker實例的啓動shell中的密碼。但是,這需要我在Docker外部和我的Maven項目中使用我的bash客戶端。

另一種方法是運行/ cmd/entrypoint一個bash腳本,它可以爲docker實例設置環境變量。由於我的搬運工像node.js的運行,目前我的Dockerfile是這樣的:

FROM node:4-slim 
MAINTAINER myself 

# ... do Dockerfile stuff 

# TRIAL #1: run a bash script to set the environment varable --- UNSUCCESSFUL! 
COPY set_en_var.sh/
RUN chmod +x /set_en_var.sh 
RUN /bin/bash /set_en_var.sh 

# original entry point 
#ENTRYPOINT ["node", "mynodeapp.js", "configuration.js"] 

# TRIAL #2: use a bash script as entrypoint that sets 
# the environment variable and runs my node app .   --- UNSUCCESSFUL TOO! 
ENTRYPOINT ["/entrypoint.sh"] 

這裏是entrypoint.sh代碼:

. mybashclient.sh 
cred_str=$(get_credential <server> <dev-environment> <role> <key>) 
export APP_PASSWORD=($cred_str) 

# run the original entrypoint command 
node mynodeapp.js configuration.js 

這裏是我的set_en_var.sh代碼:

. mybashclient.sh 
cred_str=$(get_credential <server> <dev-environment> <role> <key> 
export APP_PASSWORD=($cred_str) 

所以2問題:

  1. 哪一個更好的選擇,讓我的bash客戶端密碼住在碼頭或碼頭外?
  2. 如果我在Docker中使用它,我如何使用cmd/run/entrypoint來實現這個功能?
+0

什麼'。 mybashclient.sh'呢? 「mybashclient.sh」的內容是什麼? –

+0

也有端口:-8080:8080。我希望'-'是typo –

+0

@TarunLalwani'。 mybashclient.sh'應該來源於腳本。該腳本包含一個名爲'get_credential'的函數。 – breezymri

回答

0

哪一個更好的選擇,讓我的bash客戶端密碼住在碼頭或碼頭外?

一直在裏面。您不需要依賴主機操作系統。你想盡可能地避免這種情況

如果我在碼頭裏面,我該如何使用cmd/run/entrypoint來達到這個目的?

考慮的代碼下面的行,你用

RUN /bin/bash /set_en_var.sh 

這不會在所有的工作。因爲您不會對碼頭集裝箱進行任何更改。你只需運行一個bash即可獲得一些環境變量,然後bash退出,OS上的任何內容都不會發生變化。 Dockerfile構建只會維護該命令發生在操作系統上的更改。在你的情況下,除了那個bash的會話,沒有什麼變化。

接下來您在構建時間內執行此操作的方法也不合理。如果你用它裏面的環境變量來構建它,那麼你打破了獲取最新憑證的命令的目的。假設你改變密碼,那麼這將需要你重建圖像(如果它已經工作)

現在你的entrypoint.sh方法是正確的,它應該工作。你應該檢查它出了什麼問題。也呼應cred_str您的測試,以確保您從命令

最後得到正確的憑據詳細迴應該行

node mynodeapp.js configuration.js 

改變

exec node mynodeapp.js configuration.js 

這確保了你的節點進程成爲PID 1.

+0

我提出了建議的更改。 docker文件可以建立,我可以做docker運行它。它在'docker ps'中顯示'command'是'/ entrypoint.sh'。但是當我執行'docker inspect'時,雖然我看到如下所示的東西,但是我沒有看到名爲APP_PASSWORD的任何環境變量:'「PATH =/usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin「, 」NPM_CONFIG_LOGLEVEL = info「, 」NODE_VERSION = 4.8.4「,' – breezymri

+0

我甚至沒有使用客戶端腳本來獲取現場密碼。我只是用這樣一個表單:'export APP_PASSWORD =「LOCAL」' – breezymri

+0

發現我確實在docker容器中獲取了環境變量,而不是在根進程中。它實際上在生成的節點進程中可見。感謝您的解釋。 – breezymri