首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用特定的停靠程序用户时,无法执行npm更新

当使用特定的停靠程序用户时,无法执行npm更新
EN

Stack Overflow用户
提问于 2022-03-30 13:11:44
回答 3查看 650关注 0票数 1

我已经创建了一个与主机用户相关联的php容器,这样我就不会对在docker容器中生成的文件产生任何问题(例如:当使用php artisan make:controller时)。

所以我有这个docker-compose.yml

代码语言:javascript
复制
    version: '3.9'
    
    services:
    
      laravel-fpm:
        user: 1000
        container_name: laravel_app
        restart: always
        build:
          context: .
          dockerfile: ./docker/php-fpm/Dockerfile
        volumes:
          - ./src:/var/www/html

这是Dockerfile

代码语言:javascript
复制
    FROM php:8.0.2-fpm-alpine
    WORKDIR /var/www/html
    
    RUN docker-php-ext-install pdo_mysql
    RUN docker-php-ext-install mysqli
    RUN apk add icu-dev
    
    # Installa nodejs per l'utilizzo delle dipendenze npm
    RUN apk add --update npm
    RUN npm install gulp-cli -g
    RUN npm install
    
    CMD ["php-fpm"]
    
    EXPOSE 9000

当我在容器docker-exec -it laravel_app sh中访问,然后运行npm install时,我得到:

您的缓存文件夹包含根拥有的文件,这是由于npm中的错误!以前版本的国家预防机制,后来得到了解决。npm错误!npm错误!若要永久解决此问题,请运行: npm!数独创-R 1000:0 "/.npm“npm错误!代码EACCES npm错误!系统呼叫npm错误!路径/.npm npm错误!13

这个问题与我在容器上指定的USER指令有关,有办法解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-11 17:06:44

问题

当以uid 1000的形式运行Docker容器时,容器中不存在该用户,因此默认路径(例如通常位于运行用户的主目录中的npm缓存)没有任何地方可供使用,因此默认为/。在构建过程中,您将充当root,因为没有USER指令。此外,构建中的npm install可能正在创建缓存目录,但是如果没有package.json,就没有什么可安装的了。

解决方案

在Dockerfile.

  • Change中
  1. 创建用户,其中npm正在编写cache.
  2. Pre-create目录

创建用户

如果您创建了这个用户,那么假设它总是同一个用户,但是由于您正在设置Docker中的用户,所以这可能不是最好的解决方案(如果您使用的是另一个用户呢?)如果您可以推理您将是哪个用户,那么使用Dockerfile中的用户指令,这可能是最好的选择。

更改npm缓存位置

您可以使用一个.npmrc文件,并设置cache=/some_dir,或者在命令行npm install --cache=/some_dir上对此进行更改。我建议您在根目录fs中创建一个合理的位置,类似于/npm,然后是cache=/npm/.npm

在您的Dockerfile中,它应该如下所示:

代码语言:javascript
复制
# Set the NPM cache location
RUN mkdir /npm && chmod a+rwx /npm

预创建目录

最简单的选择可能是预先创建具有打开权限的缓存目录。Dockerfile节录如下所示:

代码语言:javascript
复制
...
RUN apk add --update npm
RUN npm install gulp-cli -g
# You don't need this if you haven't got the
#  application code in the build.
# RUN npm install
RUN mkdir /.npm && chmod a+rwx /.npm
...

如果要跨容器持久保存此文件,则可以创建卷或将本地文件夹绑定到停靠器撰写文件中的容器中。

票数 1
EN

Stack Overflow用户

发布于 2022-04-11 17:23:37

最干净的方法是预先创建用户并配置npms路径前缀。

代码语言:javascript
复制
FROM php:8.0.2-fpm-alpine

# use the root user for the installation
USER root

# install and configure npm
RUN apk add --update --no-cache npm
RUN npm config -g set prefix /home/dev/.local/npm

# create the local user
ARG UID="1000" GID="1000"
RUN addgroup -g $GID "dev" && \
    adduser -D -G "dev" -s /bin/sh -u $UID "dev"

# switch to the local user
USER dev

# add npms bin path to PATH
ENV PATH="$PATH:/home/dev/.local/npm/bin"

# install package as user
RUN npm install gulp-cli -g
票数 1
EN

Stack Overflow用户

发布于 2022-04-07 19:42:08

正如错误消息所述,您可以运行以下命令以永久消除错误。

代码语言:javascript
复制
$ sudo chown -R 1000:0 "/.npm"

注意:由于此命令是以sudo权限运行的,您可能必须提供一个管理密码。

还可以在Dockerfile中添加此命令,以避免手动运行它。

代码语言:javascript
复制
RUN sudo chown -R 1000:0 "/.npm"

npm install命令之前添加此命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71677880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档