2017-08-31 88 views
0

我嘗試使用環境變量來配置生產中的rails應用程序,但我不能讓它們工作。環境變量不能在rails上工作

我出口他們在我~/.bashrc這樣

export AWS_ACCESS_KEY_ID=my_key 
export AWS_REGION=my_region 
export AWS_SECRET_ACCESS_KEY=my_secret_key 
export S3_BUCKET_NAME=my_bucket_name 
export S3_HOST_NAME=my_host_name 

,如果我用我的printenv終端上,我可以看到他們。

我訪問他們在我production.rb這樣

config.paperclip_defaults = { 
    storage: :s3, 
    s3_region: ENV['AWS_REGION'], 
    s3_host_name: ENV['S3_HOST_NAME'], 
    bucket: ENV['S3_BUCKET_NAME'], 
    s3_credentials: { 
     access_key_id: ENV['AWS_ACCESS_KEY_ID'], 
     secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], 
    } 
} 

利用這種配置我的應用程序崩潰時我打開與圖像的鏈接,說我如果我將它們保存到指定BUCKET_NAME

secrets.yml和訪問他們這個樣子,它完美

config.paperclip_defaults = { 
     storage: :s3, 
     s3_region: Rails.application.secrets.s3_region, 
     s3_host_name: Rails.application.secrets.s3_host_name, 
     bucket: Rails.application.secrets.s3_bucket_name, 
     s3_credentials: { 
      access_key_id: Rails.application.secrets.access_key, 
      secret_access_key: Rails.application.secrets.secret_access_key, 
     } 
    } 

當我部署在Heroku上,並通過儀表盤設置日e環境變量再次工作很好,只有當我通過我的計算機中的ENV ['key']訪問它時,崩潰纔會崩潰

[編輯]問題出在紅寶石礦上,我添加了-ic到腳本啓動它,解決了這個問題。謝謝大家

+0

您的應用程序是否使用其他用戶?也許你需要把它們放在/ etc/environment中? – NickyNick

+0

你如何開始你的申請?在您設置環境的同一終端中,您可以運行'irb'並檢查'puts ENV ['AWS_ACCESS_KEY_ID']' – Kukunin

回答

2

您可能想要使用DirEnvDotEnv,它們都從文件加載ENV變量。這是一個比混亂你的個人資料更理智的方法。

config.paperclip_defaults = { 
    storage: :s3, 
    s3_region: ENV.fetch('AWS_REGION'), 
    s3_host_name: ENV.fetch('S3_HOST_NAME'), 
    bucket: ENV.fetch('S3_BUCKET_NAME'), 
    s3_credentials: { 
     access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'), 
     secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY') 
    } 
} 

這使得它更容易解決,因爲你將得到:訪問ENV瓦爾這是不可選的使用的ActiveSupport #fetch方法時,這樣的提高,如果VAR未設置錯誤

另外啓動Rails服務器時發生錯誤,而不是稍後在使用env var時將應用程序炸掉。

+0

高度推薦dotenv gem。 – moveson

+0

@moveson我已轉移到DirEnv。在shell級別解決它更有意義,而不是使每個項目都依賴於DotEnv。 – max

0

而不是把env變量放在系統範圍內,我建議你使用Rails dotenv library並把你自定義的需要變量放在.env文件中。因此,我們可以讓env變量對於只有應用程序而不是系統範圍的內容保密。