2015-11-28 3 views
0

Я хотел бы предоставить простой и удобный контейнер Docker для приложения с открытым исходным кодом, который принимает URL-адрес файла конфигурации в качестве аргумента и использует этот файл.Как запускать Docker и node.js с удаленными конфигурациями

Dockerfile довольно прямо вперед:

FROM phusion/baseimage 
# Use baseimage-docker's init system. 
CMD ["/sbin/my_init"] 

RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - 
RUN apt-get update 
RUN apt-get install -y nodejs git 
ADD  . /src 
RUN  cd /src; npm install; npm update 
ENV NODE_ENV production 
CMD  ["/usr/bin/node", "/src/gitevents.js"] 

Я не нашел способ добавления файла, когда контейнер работает (с ADD или Entrypoint), так что я пытаюсь работать его в Node.js :

docker run -e "CONFIG_URL=https://gist.githubusercontent.com/PatrickHeneise/c97ba221495df0cd9a3b/raw/fda1b8cd53874735349c6310a6643e6fc589a404/gitevents_config.js" gitevents 

это устанавливает CONFIG_URL как переменную окружения, которые я могу использовать в узле. Однако мне нужно загрузить файл, который является асинхронным, какой тип не работает в текущей настройке.

if (process.env.NODE_ENV === 'production') { 
    var exists = fs.accessSync(path.join(__dirname, 'common', 'production.js'), fs.R_OK); 
    if (exists) { 
    config = require('./production'); 
    } else { 
    // https download, but then `config` is undefined when running the app the first time. 
    } 
} 

В node.js нет синхронной загрузки, любые рекомендации, как я мог бы это решить?

Я бы хотел, чтобы Docker выполнял эту работу с ADD или CMD, делая завиток, но я не уверен, как это работает?

ответ

1

Другое дело было бы считать, что ваш «конфигурационный файл» не является файлом, но просто текст и передать содержимое контейнеру во время выполнения.

CONFIG = "$ (завиток -sL https://gist.githubusercontent.com/PatrickHeneise/c97ba221495df0cd9a3b/raw/fda1b8cd53874735349c6310a6643e6fc589a404/gitevents_config.js)"

докер запустить -e "CONFIG_URL = $ {CONFIG}" gitevents

0

Мне удалось перезаписать мой скрипт конфигурации, чтобы работать асинхронно, но не лучшим решением в моих глазах.

var config = {}; 
var https = require('https'); 
var fs = require('fs'); 
var path = require('path'); 

config.load = function(fn) { 
    if (process.env.NODE_ENV === 'production') { 
    fs.access(path.join(__dirname, 'production.js'), fs.R_OK, function(error, exists) { 
     if (exists) { 
     config = require('./production'); 
     } else { 
     var file = fs.createWriteStream(path.join(__dirname, 'production.js')); 
     var url = process.env.CONFIG_URL; 

     if (!url) { 
      process.exit(-1); 
     } else { 
      https.get(url, function(response) { 
      response.pipe(file); 
      file.on('finish', function() { 
       file.close(function() { 
       return fn(require('./production')); 
       }); 
      }); 
      }); 
     } 
     } 
    }); 
    } else if (process.env.NODE_ENV === 'test') { 
    return fn(require('./test')); 
    } else { 
    return fn(require('./development')); 
    } 
}; 

module.exports = exports = config; 
1

Как насчет комбинации ENTRYPOINT и переменной окружения? У вас будет ENTRYPOINT в файле Dockerfile, установленном на сценарий оболочки, который загрузит файл конфигурации, указанный в переменной окружения, а затем запустит приложение. Поскольку сценарий точка входа будет получать все, что в CMD, как это аргументы, шаг запуска приложения может быть достигнуто что-то вроде

# Execute CMD. 
eval "[email protected]" 
+0

Это звучит интересно. Я попробую. – Patrick

+0

Я написал файл 'init.sh' с командой curl, а затем запущенным узлом, но это кажется грязным. Запуск скрипта через CMD из файла Docker. – Patrick

Смежные вопросы