Как запустить node.js с gulp внутри докера и найти правильный bashsrc - PullRequest
0 голосов
/ 21 января 2019

Я новичок в Docker и у меня действительно есть некоторые проблемы.

Моя цель: - использовать Dockerfile, чтобы создать docker-контейнер и оставаться внутри контейнера / не выпадать из него.- запуск локального Docker-контейнера - установка «gulp» с помощью package.json - установка «gulp global» на Docker - копирование любых файлов в мой Docker-контейнер - выполнение «gulp --version» и «gulp task» по умолчанию и сохранениевнутри терминала.

Вот мои настройки:

Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --global gulp-cli
RUN npm install
COPY . .
EXPOSE 3000
CMD ["gulp --version" , "gulp"]  or? [gulp --version , gulp]

package.json

{
  "name": "docker-test",
  "version": "1.0.0",
  "description": "Testing Docker",
  "main": "index.js",
  "scripts": {
    "test": "test"
  },
  "author": "",
  "license": "",
  "devDependencies": {
    "gulp": "^4.0.0"
  }
}

gulpfile.js

function defaultTask(cb) {
 console.log("Default task for gulp 4.0 for docker")
  cb();
} 
exports.default = defaultTask 

docker-compose.yml (я не думаю, что нам нужно это для моего вопроса, но я все равно опубликую его, так как я не совсем уверен, если это может создать некоторые проблемы)

version: '3'
services:
  html:
    container_name: gulp-docker-test
    restart: always
    build: .
    ports:
      - '80:3000'

Мои проблемы сейчас:

Прежде всего, я действительно запутался в рабочем процессе докера.Правильно ли я понимаю, если я запущу:

docker build . --tag gulp-docker-test 

Я создам на моем компьютере новый docker-контейнер с содержимым dockerfile?Если мне нужно что-то обновить внутри, я должен запустить его снова, чтобы обновить контейнер?

Если я использую:

docker start gulp-docker-test

, он запустит контейнер?Что если я что-то изменит внутри?Будет ли это снова при перезагрузке контейнера?Или он пропал, потому что это только временный образ?

Кроме того, если я пытаюсь запустить его, я получаю эту ошибку:

ERROR: for gulp-docker-test  Cannot start service html: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"gulp --version\": executable file not found in $PATH": unknown

ERROR: for html  Cannot start service html: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"gulp --version\": executable file not found in $PATH": unknown

Я пробовал эти вещи: выполнить его с execудаляя кавычки внутри CMD из Dockerfile, но я думаю, что мне не хватает некоторых базовых знаний.Я не понимаю, как загрузить этот контейнер внутри оболочки, чтобы докер знал путь $.

Заранее спасибо за помощь

Редактировать:

Я узнал, как запустить Docker с оболочкой.

docker run -it --entrypoint bash  gulp-docker-test3
root@8a27dc3a9c85:/usr/src/app# gulp -v
[15:01:53] CLI version 2.0.1
[15:01:53] Local version 4.0.0
root@8a27dc3a9c85:/usr/src/app# gulp 
[15:02:38] Using gulpfile /usr/src/app/gulpfile.js
[15:02:38] Starting 'default'...
Default Task von Gulp 4.0 für Docker
[15:02:38] Finished 'default' after 4.28 ms
root@8a27dc3a9c85:/usr/src/app# 

Похоже, это должно работать, если я могу добавить bash по умолчанию в dockerfile.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если я запускаю docker build Я создам новый контейнер?

Он выполнит содержимое файла Docker и создаст новое изображение .

Вам нужно docker run (или, редко, docker create) изображение, чтобы создать из него контейнер. Когда вы обновляете Dockerfile или исходный код приложения, вам нужно повторить шаг docker build, docker stop && docker rm существующий контейнер и docker run новый. Ваш docker-compose.yml фрагмент инкапсулирует это, но учтите, что Docker Compose удалит и заново создаст контейнер, когда это будет необходимо.

Если я использую docker start gulp-docker-test ...

Запустится контейнер с таким именем. Это отдельное пространство имен из пространства имен изображения. Контейнер должен уже существовать и быть остановленным (обычно из явной команды docker stop). Это немного необычное состояние.

CMD ["gulp --version" , "gulp"]

Он ищет двоичный файл с именем gulp --version и запускает его с одним параметром gulp. Поскольку у вас, вероятно, нет ни одного файла с именем /usr/local/bin/gulp --version (с пробелами и "версией" как частью имени файла), вы получите ошибку.

Вы получаете один CMD в Dockerfile. (Или одна ENTRYPOINT вместо этого, но я склонен считать, что CMD предпочтительнее, за исключением пары чрезвычайно специфических случаев.) Каждое «слово», которое вы вводите в оболочке, становится отдельным «словом» в синтаксисе. Так что вы могли бы, например, написать

CMD ["gulp", "--version"]

В качестве альтернативы, если вы не включите скобки, Docker обернет текст CMD в sh -c ..., так что что-то ближе к тому, что вы на самом деле написали, будет

CMD gulp --version && gulp

На практике вы обычно запускаете инструменты сборки, такие как Gulp, как часть построения образа, и используете CMD для фактического запуска приложения.

RUN gulp
CMD ["npm", "start"]
0 голосов
/ 21 января 2019

Первый

Я создам новый докер-контейнер на моем компьютере с содержимым из докер-файла? Если мне нужно что-то обновить внутри, я должен запустить его снова, чтобы контейнер обновился?

docker-build создает изображение (например, ISO). Чтобы создать контейнер, вы должны запустить / запустить этот образ. Контейнер - это запущенный образ, который может отличаться от исходного, поскольку во время выполнения вы можете изменить файловую систему внутри. Когда вы останавливаете и удаляете контейнер, все изменения теряются. Практика докеров не заключается в том, чтобы хранить данные в изображениях - если изображение производит что-то ценное, его следует хранить снаружи (рассмотрим объемы для этого).

Второй

CMD ["gulp --version" , "gulp"]

Это неверно. Обозначение JSON требует, чтобы вы помещали каждый аргумент в отдельный элемент массива. Это правильно:

CMD ["guld", "--version"]

Заключение

Вы создаете изображение с помощью

docker build -t my-image .

Вы запускаете его (создаете контейнер) с

docker run --name=my-image-instance my-image

Если вам нужно контролировать работающий контейнер, вы можете использовать понятное имя my-image-instance или, если вы его не указали, ID

контейнера
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...