Ubuntu: 우분투 환경에서 환경변수 로딩 문제
조회수 1579회
안녕하세요.
윈도우즈에서 nodejs를 개발중이고 우분투에 배포하려고 하고 있습니다. 개발환경에서는 .env
파일에서 환경변수를 잘 읽어옵니다. ubuntu production에서는 undefined
만 나옵니다.
라이브러리를 required할때 dotenv npm usage에 나와있듯이 아래와 같이 작성했습니다:
require('dotenv').config()
라이브러리 요청시에 혹시 제가 모르고 있는 옵션이 있는지 있어서 로딩이 안되는걸까요? 혹시 폴더구조라던가 다른 코드가 필요하다면 말씀해주시겠어요?
읽어주셔서 감사합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
# * .env a=1 b=2
mint(ubuntu 18.04 기반)에서 테스트 해보니 문제가 없습니다.
let dotenv = require('dotenv'); require('dotenv').config({ path: '/home/allinux/.env' }); console.log(process.env.a); console.log(process.env.b); 1 2
- 정영훈님 답변 정성스럽게 달아주시느라고 정말 고생하셨습니다. 제 멍청한 실수를 찾았습니다. 깃헙에 .env파일을 안올리다보니 인스턴스로는 .env파일을 원시적인 방법으로 복붙했습니다. 그과정에서 문자열이 떨어져나갔더군요. ㅠㅠ 알 수 없는 사용자 2019.5.29 09:48
- 하다보면 그런경우도 있고 그렇죠. 원인찾고 해결하셨다니 다행입니다. 정영훈 2019.5.29 22:07
-
디렉토리 구조는 아래와 같습니다:
└─src ├─db │ └─models ├─routes │ ├─blog │ ├─blogFeed │ ├─youtube │ └─youtubeFeed └─utils
src/app.js
에서는 아무 설정없이 환경변수가 당연히 로딩이 되구요. 문제인건 db로더를sequelize
코드 컨벤션대로src/db/models/index.js
에 작성해뒀습니다. 아래코드는src/db/models/index.js
입니다:require('dotenv').config(); const mongoose = require('mongoose'); const env = process.env; module.exports = () => { connect = () => { mongoose.connect( `${env.MONGO_URI}${env.MONGO_DATABASE}`, { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: true }, err => { if (err) { console.error(`connection error:`, err); } console.log( `> Connected on - URI: ${env.MONGO_URI} - Database: ${env.MONGO_DATABASE.toUpperCase()} - Environment: ${env.NODE_ENV.toUpperCase()}` ); } ); }; connect(); mongoose.connection.on('disconnected', connect); };
로컬에서는 분명히 잘됩니다.
undefined
로 환경변수가 잡히지도 않구요.heroku
에서도 당연히 환경변수 설정을 설정페이지에서 해줬기때문에.env
파일과 상관없이production
모드로 잘 작동합니다.문제는
.env
파일까지 1도 틀림없이 우분투 인스턴스에 들어갔는데.env
파일로 설정한 환경변수가undefined
로 잡힌다는거죠.dotenv
깃헙 저장소나 스택오버플로우에서 찾아봤지만 죄다path
를 작성해주란 말 뿐이었습니다. 이게 맞겠다싶어 따라해봤는데 안되는군요.// local env let path = require('path').join(__dirname, '../../../.env'); require('dotenv').config({ path: path }); console.log(path); // C:\dev\training\rss-feed\.env
우분투에서는
// ubuntu instance env let path = require('path').join(__dirname, '../../../.env'); require('dotenv').config({ path: path }); console.log(path); // /home/ubuntu/training-rss-feed/.env
경로는 콘솔에 찍히는데 환경변수 인식이 안되는건 도저히 이해가 안되네요. 혹여 제가 멍청한 실수라도 한건지 알려주시면 감사하겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 문제를 해결하려면 일단 dotnev 로만 우분투에서 문제재현을 해보세요. 꼭 재현을 해야 합니다. 만약 별도 테스트를 했을시 문제가 없다면 문제해결이 어려워집니다. dotenv 문제가 아니라는 결론이니까요. .env 파일 퍼미션은 어떻해 되어 있나요? 정영훈 2019.5.28 21:03
- 파일권한은 손대지 않았으니 당연히 dot파일이라 숨김으로 되어있습니다. 로컬과 우분투 인스턴스, 똑같은 코드로 재현했습니다. 일단은 정신이 맑을때 다시 손대려고 json파일 하나 만들어 가라로 서버는 돌리긴 했습니다. 도움주시려고 해서 감사합니다. 알 수 없는 사용자 2019.5.28 21:16
- 숨김이 아니라...ls -al 해보면 -rw-r--r-- 이렇게 된 것을 알려달라는 이야깁니다. 읽기 권한이 있는지 보려구요. 정영훈 2019.5.28 22:22
- 딱 -rw-r--r-- 이걸로 찍힙니다. 알 수 없는 사용자 2019.5.28 22:53
- 권한도 문제가 없군요. 그럼 아래에 제가 테스트한 코드를 path 와 .env를 변경해서 해보세요. 우분투에서 dotenv 모듈이 동작하는지 알고자 합니다. 정영훈 2019.5.29 07:13
- 물론 절대경로로도 해봤습니다. 계속 이러는걸 보면 제가 멍청한 실수를 한게 맞는것같습니다. 다시 한번 찾아보고 댓글 달아보겠습니다. 알 수 없는 사용자 2019.5.29 08:17
-
댓글 입력