当前位置: 首页 > 知识库问答 >
问题:

dockerFile复制:生成上下文之外的禁止路径:

马弘和
2023-03-14

我有以下文件夹结构:

 - main/

     .docker-compose.yml

 - backend/

   - micro-hr/

       .dockerfile

   - rabbitmq

我有我的micro-hr文件夹,其中是我的主包,我有一个本地lib,它是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/ && npm install
#copy other files
COPY . /usr/src/api/
COPY ../rabbitmq /usr/src/rabbitmq/
#set work dir
USER node

docker撰写:

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

这是我的包裹。我的主包后端/微hr上的json:

{
  "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链接链接到我的lib,并尝试在docker中创建文件夹,但无济于事。

docker构建错误:

步骤6/10:复制/rabbitmq/包。json/usr/src/rabbitmq/ERROR:Service“micro-hr”未能生成:复制失败:生成上下文之外的禁止路径:/rabbitmq/包。json()

共有2个答案

苗征
2023-03-14

您需要在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

您始终需要提供上下文。

太叔昆
2023-03-14

这一行在<代码>中。dockerfile:

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

告诉Docker查找文件包。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复制后端/micro-hr/rabbitmq/package。json,它不存在。此外,您的rabbitmq目录根本不在构建上下文中,因此无论您将什么放入Dockerfile,它都永远不会被找到。

所以你应该改变你的<代码>。docker撰写。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/ && 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

设置用户,而不是工作目录。

 类似资料:
  • 我有一个包含各种Go服务和库的monorepo。目录结构如下所示: 这<代码>开始。mod文件位于monorepo目录的根目录中,服务使用该文件中声明的依赖项。 我使用以下命令构建Docker图像: 当我尝试使用上述Docker命令从monorepo目录的根构建Docker图像时,我得到以下错误: 复制失败:生成上下文之外的禁止路径:/去mod() 下面是我的Dockerfile 我需要做些什么才

  • 我正在尝试将一个dockerfile放入我的主启动项目的子目录中。有一个称为的依赖项项目。当dockerfile位于的根目录中时,所有文件都正常工作,但当它嵌套在的子目录中时,它将失败 这对我来说是有意义的,因为它嵌套在子目录中,所以我只是在COPY命令前面添加了一个“../”,但这会导致以下上下文异常: 好的,这也是有意义的,因为docker文档说明上下文从dockerfile所在的地方开始,但

  • 我的本地服务器上有一个工作的Docker Compose,现在我必须转到prod,我只是复制了prod服务器上的整个目录,相同的目录结构、配置文件等。但是当我运行Docker Compose命令(Docker-Compose-f Docker-Compose.dev.yml up)时,它抛出了以下错误: 步骤 7/28 : 复制 ../../data_acquisition_survey_api/

  • 我有一个包含多个项目的解决方案。我想创建一个项目的docker映像,所以我通过docker支持添加了一个Dockerfile。我添加Dockerfile的项目对同一级别的其他项目具有构建依赖关系。当我尝试通过Docker运行项目时,我收到以下错误: 复制失败:生成上下文之外的禁止路径:/应用程序编程接口。常见的AspNetCore/API。常见的AspNetCore。csproj() C: \用户

  • 我想根据我在<代码>中构建的服务来组织我的docker图像文件。docker目录。首先,我想构建web docker容器。注意,在docker文件中,我是如何将webroot文件复制到docker容器的。问题是,在我的docker compose中。yml,当构建图像时,它引用来自目录,而不是实际的webroot。我尝试在docker文件中使用相对路径,但似乎不起作用。你知道我该怎么做吗? Doc