docker EACCES:在容器中运行nestjs时,权限被拒绝,mkdir '/usr/src/app/dist'

cyej8jka  于 2024-01-06  发布在  Docker
关注(0)|答案(2)|浏览(173)

我试图通过GitHub Actions在Google Cloud上的VM上的容器内运行NestJS应用程序。
在本地,一切都正常运行,但在VM上,我收到以下权限错误:

  1. error TS5033: Could not write file '/usr/src/app/dist/users/enums/role.enum.js': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  2. error TS5033: Could not write file '/usr/src/app/dist/users/enums/role.enum.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  3. error TS5033: Could not write file '/usr/src/app/dist/users/users.module.d.ts': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  4. error TS5033: Could not write file '/usr/src/app/dist/users/users.module.js': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  5. error TS5033: Could not write file '/usr/src/app/dist/users/users.module.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  6. error TS5033: Could not write file '/usr/src/app/dist/users/users.resolver.d.ts': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  7. error TS5033: Could not write file '/usr/src/app/dist/users/users.resolver.js': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  8. error TS5033: Could not write file '/usr/src/app/dist/users/users.resolver.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  9. error TS5033: Could not write file '/usr/src/app/dist/users/users.service.d.ts': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  10. error TS5033: Could not write file '/usr/src/app/dist/users/users.service.js': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  11. error TS5033: Could not write file '/usr/src/app/dist/users/users.service.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'.
  12. [6:19:10 PM] Found 154 errors. Watching for file changes.

字符串
我的Dockerfile:

  1. ###################
  2. # BUILD FOR LOCAL DEVELOPMENT
  3. ###################
  4. FROM node:18 As development
  5. WORKDIR /usr/src/app
  6. COPY --chown=node:node package*.json ./
  7. RUN npm ci
  8. COPY --chown=node:node . .
  9. USER node
  10. ###################
  11. # BUILD FOR PRODUCTION
  12. ###################
  13. FROM node:18 As build
  14. WORKDIR /usr/src/app
  15. COPY --chown=node:node package*.json ./
  16. COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules
  17. COPY --chown=node:node . .
  18. RUN npm run build
  19. ENV NODE_ENV production
  20. RUN npm ci --only=production && npm cache clean --force
  21. USER node
  22. ###################
  23. # PRODUCTION
  24. ###################
  25. FROM node:18 As production
  26. COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
  27. COPY --chown=node:node --from=build /usr/src/app/dist ./dist
  28. CMD [ "node", "dist/main.js" ]


docker-compose:

  1. services:
  2. api:
  3. restart: always
  4. build:
  5. dockerfile: Dockerfile
  6. context: .
  7. target: development
  8. env_file:
  9. - .env
  10. command: npm run start:dev
  11. ports:
  12. - 3000:3000
  13. depends_on:
  14. - postgres
  15. postgres:
  16. image: postgres
  17. restart: always
  18. ports:
  19. - "5435:5432"
  20. environment:
  21. POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
  22. pgadmin:
  23. image: dpage/pgadmin4
  24. restart: always
  25. container_name: pgadmin4
  26. environment:
  27. - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
  28. - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
  29. ports:
  30. - '5050:80'
  31. depends_on:
  32. - postgres
  33. redis:
  34. image: redis
  35. ports:
  36. - "6379:6379"
  37. restart: always
  38. environment:
  39. - REDIS_PASSWORD=${REDIS_PASSWORD}
  40. command: redis-server --requirepass ${REDIS_PASSWORD}


CI:

  1. name: deployment
  2. on:
  3. push:
  4. branches: [ "test" ]
  5. pull_request:
  6. branches: [ "test" ]
  7. jobs:
  8. deploy:
  9. runs-on: self-hosted
  10. steps:
  11. - name: Clone repository
  12. uses: actions/checkout@v4
  13. with:
  14. ref: ${{ github.event.pull_request.head.ref }}
  15. - run: echo "🖥️ The workflow is now ready to test your code on the runner."
  16. - name: List files in the repository
  17. run: |
  18. ls ${{ github.workspace }}
  19. - run: cp .env.example .env
  20. - run: npm install
  21. - name: deploy
  22. run: docker compose -f ci.docker-compose.yml up --detach --force-recreate


正如你所看到的,我只使用了Dockerfile中的开发部分。
我在Dockerfile和docker-compose中使用了不同的语句:chown,mkdir dist等,但没有成功。
编辑:
我重新构造了Dockerfile:

  1. FROM node:18
  2. WORKDIR /usr/src/app
  3. COPY package*.json ./
  4. RUN npm install
  5. COPY . .
  6. RUN npm run build
  7. EXPOSE 3000
  8. CMD ["npm", "run", "start:dev"]


Docker compose:

  1. services:
  2. api:
  3. build:
  4. dockerfile: Dockerfile
  5. context: .
  6. restart: always
  7. ports:
  8. - '3000:3000'
  9. env_file:
  10. - .env
  11. depends_on:
  12. - postgres
  13. volumes:
  14. - .:/app/src
  15. postgres:
  16. image: postgres
  17. restart: always
  18. ports:
  19. - "5432:5432"
  20. environment:
  21. POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
  22. pgadmin:
  23. image: dpage/pgadmin4
  24. restart: always
  25. container_name: pgadmin4
  26. environment:
  27. - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
  28. - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
  29. ports:
  30. - '5050:80'
  31. depends_on:
  32. - postgres
  33. redis:
  34. image: redis
  35. ports:
  36. - "6379:6379"
  37. restart: always
  38. environment:
  39. - REDIS_PASSWORD=${REDIS_PASSWORD}
  40. command: redis-server --requirepass ${REDIS_PASSWORD}


我不知道以前的配置有什么问题,但这一个工作正常。

a8jjtwal

a8jjtwal1#

试试这个,我希望它工作.检查你的dist目录的所有者,如果它是root更改为非root用户$USER或删除你的目录,并重建它没有sudo权限.

wrrgggsh

wrrgggsh2#

我猜这是因为用户“node”没有权限mkdir“dist”和修改其中的文件。
如果我是你,我会连接到容器的文件系统并检查所有者。这是找到真实的原因的最可靠方法。

相关问题