Как загрузить golang и node в контейнер docker

#node.js #docker #go

#node.js #docker #Вперед

Вопрос:

Я создаю простой сервер узлов для запуска в docker. Я представил небольшой модуль golang, который может быть выполнен путем запуска

 go run /root/component-review-handler/downloader/main.go -build 1621568 -outdir /usr
 

В настоящее время я запускаю это локально на своем узловом сервере, запустив следующий скрипт при запуске

 exec(
    `cd ${process.env.ROOT_PATH}/component-review-handler amp;amp; go run cmd/downloader/main.go`,
    (error, stdout, stderr) => {
      if (error) {
        logger.error(`error: ${error.message}`)
        return
      }
      if (stderr) {
        logger.log(`stderr: ${stderr}`)
        return
      }
      logger.log(`stdout: ${stdout}`)
    }
  )
 

Но когда я запускаю код в docker, я получаю следующую ошибку

 error: Command failed: cd /usr/src/app/component-review-handler amp;amp; go run cmd/downloader/main.go

/bin/sh: 1: go: not found
 

Кто-нибудь знает, как я могу установить как node, так и golang в свой контейнер docker?
Текущий файл Dockerfile

 FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

ENV NODE_TLS_REJECT_UNAUTHORIZED='0'

EXPOSE 3000

CMD ["node", "server.js" ]
 

Комментарии:

1. так же, как вы установили бы их в любой другой системе.

Ответ №1:

Go — это скомпилированный язык, и обычно вам не нужен набор инструментов Go только для запуска программы Go.

Для этого я бы использовал многоступенчатую сборку. Первый этап FROM golang — создать набор инструментов и создать двоичный файл; второй COPY --from — поместить первое изображение в каталог, который обычно находится на пути поиска.

 FROM golang:1.17 AS downloader
WORKDIR /app                       # not under /go
COPY component-review-handler/ ./  # (double-check this COPY syntax)
RUN go build -o downloader ./cmd/downloader

FROM node:14
# vvv add this line
COPY --from=downloader /app/downloader /usr/local/bin/

# same as before
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
ENV NODE_TLS_REJECT_UNAUTHORIZED='0'
EXPOSE 3000
CMD ["node", "server.js"]
 

Поскольку двоичный файл теперь находится в /usr/local/bin $PATH каталоге по умолчанию, в вашем коде вы можете просто запустить его, без cd go run частей или

 const { execFile } = require('child_process');
execFile('downloader',
         (error, stdout, stderr) => { ... });
 

Комментарии:

1. Похоже, это работает! Большое спасибо! Знаете ли вы, как я мог бы добавить аргументы в команду go? Например, если бы мой скрипт выглядел так, запустите /root/component-review-handler/downloader/main.go -build 1621568 -outdir /usr

2. execFile() принимает массив дополнительных аргументов; execFile('downloader', ['-build', '1621568', '-outdir', '/usr'], callback);

3. Прекрасное спасибо!