Копирование файла dockerFile: запрещенный путь вне контекста сборки:

#docker #docker-compose

#docker #docker-compose

Вопрос:

У меня следующая структура папок:

  - main/

     .docker-compose.yml

 - backend/

   - micro-hr/

       .dockerfile

   - rabbitmq
  

у меня есть папка micro-hr, где находится мой основной пакет
и у меня есть локальная библиотека, которая называется rabbitmq

это мой файл dockerfile:

 FROM node:lts-alpine
#create app directory
#xx
WORKDIR /usr/src
RUN apk add --no-cache bash git
RUN touch /usr/src/.bashrc | echo "PS1='w$ '" >> /usr/src/.bashrc
#copy files
COPY ormconfig.ts .env package.json yarn.* ./
COPY ./rabbitmq/package.json /usr/src/rabbitmq/
#install modules lib modules
RUN cd /usr/src/api/ amp;amp; npm install
#copy other files
COPY . /usr/src/api/
COPY ../rabbitmq /usr/src/rabbitmq/
#set work dir
USER node
  

docker-compose :

 version: "3.7"
services:
  micro-hr:
    build: ./backend/micro-hr
    entrypoint: ./.docker/entrypoint.sh
    container_name: micro-hr
    environment:
      - CHOKIDAR_USEPOLLING=true
    ports:
      - 3001:3000
  

это мой package.json в моем основном бэкэнде пакета / micro-hr:

 {
  "name": "micro-hr",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "postinstall": "npm link ../rabbitmq/",
    "postupdate": "npm link ../rabbitmq/",
    "commit": "git-cz",
    "build": "babel src --extensions ".js,.ts" --out-dir dist --copy-files --no-copy-ignored",
    "start:dev": "ts-node-dev --inspect --respawn --transpile-only --ignore-watch node_modules -r tsconfig-paths/register src/index.ts",
    "start:debug": "node start --debug --watch",
    "start:prod": "node dist/index.ts",
    "test": "jest",
    "lint": "eslint --fix",
    "lint2": "eslint "{src,apps,libs,test}/**/*.ts" --fix",
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config ./ormconfig.ts",
    "migration:generate": "ts-node ./node_modules/typeorm/cli.js migration:generate -n"
  },
  "devDependencies": {
    "@babel/cli": "^7.11.5",
    "@babel/core": "^7.11.5",
    "@babel/node": "^7.10.5",
    "@babel/preset-env": "^7.11.5",
    "@babel/preset-typescript": "^7.10.4",
    "@commitlint/cli": "^9.1.2",
    "@commitlint/config-conventional": "^9.1.2",
    "@types/bcryptjs": "^2.4.2",
    "@types/cookie-parser": "^1.4.2",
    "@types/cors": "^2.8.7",
    "@types/express": "^4.17.8",
    "@types/helmet": "^0.0.48",
    "@types/jest": "^26.0.13",
    "@types/pino": "^6.3.0",
    "@types/pino-http": "^5.0.5",
    "@types/supertest": "^2.0.10",
    "@typescript-eslint/eslint-plugin": "^4.0.1",
    "@typescript-eslint/parser": "^4.0.1",
    "babel-plugin-module-resolver": "^4.0.0",
    "commitizen": "^4.2.1",
    "cz-conventional-changelog": "^3.3.0",
    "eslint": "^7.8.1",
    "eslint-config-airbnb-base": "^14.2.0",
    "eslint-config-prettier": "^6.11.0",
    "eslint-config-standard": "^14.1.1",
    "eslint-import-resolver-typescript": "^2.3.0",
    "eslint-plugin-import": "^2.22.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-prettier": "^3.1.4",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.1",
    "husky": "^4.2.5",
    "jest": "^26.4.2",
    "pino-pretty": "^4.2.0",
    "prettier": "^2.1.1",
    "supertest": "^4.0.2",
    "ts-jest": "^26.3.0",
    "ts-node": "^9.0.0",
    "ts-node-dev": "^1.0.0-pre.62",
    "tsconfig-paths": "^3.9.0",
    "tscpaths": "^0.0.9",
    "typescript": "^4.0.2"
  },
  "dependencies": {
    "amqplib": "^0.6.0",
    "assert": "^2.0.0",
    "bcryptjs": "^2.4.3",
    "class-transformer": "^0.3.1",
    "cors": "^2.8.5",
    "dotenv": "^8.2.0",
    "envalid": "^6.0.2",
    "express": "^4.17.1",
    "extendable-error": "^0.1.7",
    "helmet": "^4.1.0",
    "pg": "^8.3.3",
    "pino": "^6.5.1",
    "pino-http": "^5.2.0",
    "reflect-metadata": "^0.1.13",
    "tsyringe": "^4.3.0",
    "typeorm": "^0.2.25"
  },
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }
}
  

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

ошибка при сборке docker:

Шаг 6/10: КОПИРОВАНИЕ ../rabbitmq/package.json /usr/src/rabbitmq/ ОШИБКА: Службе ‘micro-hr’ не удалось выполнить сборку: ОШИБКА копирования: Запрещенный путь вне контекста сборки: ../rabbitmq/package.json ()

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

1. @KaranKumar извините, я отредактировал вопрос, мой плохой

2. Где ormconfig.json находится? насколько я понимаю, это должно быть там, где находится файл dockerfile.

Ответ №1:

Эта строка в .dockerfile :

 COPY ./rabbitmq/package.json /usr/src/rabbitmq/
  

указывает Docker найти файл package.json в папке rabbitmq в главном каталоге контекста сборки, а затем скопировать его в контейнер как /usr/src/rabbitmq/

Эта строка в .docker-compose.yml :

 build: ./backend/micro-hr
  

устанавливает контекст сборки в каталог backend/micro-hr относительно этого файла.

Итак, если ваша файловая структура:

 main
|- .docker-compose.yml
|- backend/
   |- micro-hr/
      |-.dockerfile
   |- rabbitmq
  

затем вы указываете Docker копировать backend/micro-hr/rabbitmq/package.json , который не существует. Кроме того, ваш rabbitmq каталог вообще не находится в контексте сборки, поэтому независимо от того, что вы помещаете в файл Dockerfile, он никогда не будет найден.

Поэтому вам следует изменить свой .docker-compose.yml на:

 version: "3.7"
services:
  micro-hr:
    build:
      context: .
      dockerfile: backend/micro-hr/.dockerfile
    entrypoint: ./.docker/entrypoint.sh
    container_name: micro-hr
    environment:
      - CHOKIDAR_USEPOLLING=true
    ports:
      - 3001:3000
  

и ваш .dockerfile к (я думаю, вы не указали, где находятся все эти файлы в вашем проекте)

 FROM node:lts-alpine
#create app directory
#xx
WORKDIR /usr/src
RUN apk add --no-cache bash git
RUN touch /usr/src/.bashrc | echo "PS1='w$ '" >> /usr/src/.bashrc
#copy files
COPY backend/micro-hr/ormconfig.ts backend/micro-hr/.env backend/micro-hr/package.json backend/micro-hr/yarn.* ./
COPY backend/rabbitmq/package.json /usr/src/rabbitmq/
#install modules lib modules
RUN cd /usr/src/api/ amp;amp; npm install
#copy other files
COPY backend/micro-hr/ /usr/src/api/
COPY backend/rabbitmq /usr/src/rabbitmq
#set work dir
USER node
  

В качестве дополнительного примечания, это:

 USER node
  

задает пользовательский, а не рабочий каталог.

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

1. моя папка rabbitmq находится в серверной папке, будет ли у моего docker-compose 2 сборки в любом случае?

2. Я исправил rabbitmq путь в своем ответе. Что вы имеете в виду под two builds ?

3. в коде u post docker-compose.yml с двумя вариантами сборки.

4. О, извините. Это была опечатка. Я также исправил это.

5. я получил эту ошибку: ОШИБКА: для 2cbbc4e334d6_micro-hr не удается запустить службу micro-hr: сбой создания среды выполнения OCI: container_linux.go: 349: запуск процесса контейнера вызвал «exec: «backend/micro-hr/.docker/entrypoint.sh «: статистика backend/micro-hr/.docker/entrypoint.sh : нет такого файла или каталога»: неизвестно

Ответ №2:

Вам необходимо указать контекст в вашем файле docker-compose :

 version: "3.7"
services:
  micro-hr:
    context: . # here
    build: ./backend/micro-hr
    entrypoint: ./.docker/entrypoint.sh
    container_name: micro-hr
    environment:
      - CHOKIDAR_USEPOLLING=true
    ports:
      - 3001:3000
  

Вам всегда нужно указывать контекст.