dockerode императивный эквивалент - PullRequest
3 голосов
/ 11 марта 2020

Я пытаюсь скомпилировать и выполнить java программу в контейнере док-станции в моем приложении узла. Я могу сделать это, сначала записав файл tmp.java с помощью basi c javascript, а затем выполнив следующие команды оболочки:

docker run --rm -v $PWD:/app -w /app java:8 javac tmp.java

docker run --rm -v $PWD:/app -w /app java:8 java tmp

Однако сейчас я пытаюсь перейти на использование модуля dockerode и пытаюсь воспроизвести эту функцию следующим образом (на примере примера с github dockerode):

docker.run(
  'java:8',
  ['javac', 'tmp.java'],
  {
    Volumes: {
      '/': {}
    },
    WorkingDir: '/'
  },
  process.stdout
)
.then(data => {
  var output = data[0]
  console.log('OUTPUT: ', output)

  var container = data[1]
  console.log(output.StatusCode)
  return container.remove()
})      

Однако это не выводит и не генерирует tmp.class, как ожидалось, когда я указываю опции Volumes и WorkingDir, и когда я пропускаю эти опции, я получаю ошибку: javac: file not found: tmp.java, что, как я предполагаю, означает, что мой том не монтируется правильно , По сути, я пытаюсь создать временный микроконтейнер, скомпилировать и запустить мою java программу в контейнере, а затем уничтожить контейнер. Таким образом, я не могу установить JDK и скомпилировать программу локально на моей хост-системе, и мне приходится работать исключительно внутри контейнера.

В настоящее время я пытаюсь использовать обязательные команды Docker для достижения этой цели. case и могу выполнить sh, используя приведенные выше команды cli, однако я не могу сделать то же самое, используя dockerode для узла (будь то с помощью обязательных команд или с помощью файла Docker).

I был бы очень признателен за любую помощь с этим!

1 Ответ

1 голос
/ 13 марта 2020

Проблема в том, что ваш каталог не сопоставлен.

Этот объект параметров является эквивалентом параметров --rm -v $PWD:/app -w /app

  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
  • AutoRemove: true равен --rm
  • Binds: [ `${process.cwd()}:/app` ] равен -v $PWD:/app с process.cwd() как $PWD
  • WorkingDir: '/app' равно -w /app

Мне также пришлось изменить порядок аргументов, так как я получал TypeError: dest.on is not a function. Запуск dockerode@3.1.0 Я должен был установить выходной поток в качестве 3-го аргумента и объект опции в качестве 4-го аргумента.

Итак, полная команда выглядела так:

docker.run(
  'java:8',
  ['javac', 'tmp.java'],
  process.stdout,
  {
    HostConfig: {
      AutoRemove: true,
      Binds: [
          `${process.cwd()}:/app`
      ]
    },
    WorkingDir: '/app'
  }
)
...