Błąd "permission denied, open '/var/www/package.json'" podczas budowania obrazu

0

Chce skonteneryzowac apke w Laravel,nginx,mariadb,php i buduję teraz dockerfile jak odpadalm docker-compose build to dostaje Error: EACCES: permission denied, open '/var/www/package.json' gdy uruchamia się RUN npm init -y. Wiem, że chodzi o uprawnienia ale dałem chmod i dalej nie działa

FROM php:8.1

RUN apt-get update -y && apt-get install -y \
    nodejs \
    npm \
    curl \
    zip \
    unzip \
    && docker-php-ext-install pdo pdo_mysql

RUN apt-get clean && rm -rf /var/lib/apt/lists/*

COPY . /var/www
WORKDIR /var/www

COPY --from=composer:2.4.2 /usr/bin/composer /usr/bin/composer

RUN useradd www -u 1000 -ms /bin/bash
RUN usermod -aG sudo www
RUN chmod -R 755 /var/www
USER www


RUN npm init -y
RUN npm install -g n && n 16.17.0
RUN npm install

RUN composer install --no-interaction --no-progress

RUN cd public && ln -sf ../storage/app/public/ storage

ENV PORT=8000
ENTRYPOINT [ "docker/entrypoint.sh" ]
0

Nie jestem linuxowcem ale na całe www dajesz 755 będąc rootem. Czyli inni mają prawo odczytu i uruchomienia. Potem przełączasz się na użytkownika www i dalej odpalasz na tym użytkowniku npm install który chce zapisu do package.json

0
jurek1980 napisał(a):

Nie jestem linuxowcem ale na całe www dajesz 755 będąc rootem. Czyli inni mają prawo odczytu i uruchomienia. Potem przełączasz się na użytkownika www i dalej odpalasz na tym użytkowniku npm install który chce zapisu do package.json

Próbowałem, na odwrót ale wtedy nie mogę dać chmod bo user nie ma uprawnień. Myślałem, że jak dam go do grupy sudo to będzie miał uprawnienia.

0

Spróbuj przełączyć użytkownika za Composer install

1

Dodaj w linii 20 komendę: chown -R www:www /var/www i powinno zadziałać.

0
loki121212 napisał(a):

Dodaj w linii 20 komendę: chown -R www:www /var/www i powinno zadziałać.

Pomogło ale mam kolejny problem z uprawnieniami teraz w linijce RUN npm install -g n && n 16.17.0
Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules'
To stwierdziłem, że dam w tym samym miejscu RUN chown -R www:www /usr/local/lib/node_modules ale nic nie pomogło.

Umieszczając go po linijce z npm init (co wydawałoby się sensowane bo tworzy folder node_modules) dalej nie działa
chown: cannot access '/usr/local/lib/node_modules': No such file or directory

RUN useradd www -u 1000 -ms /bin/bash
RUN usermod -aG sudo www
RUN chown -R www:www /var/www
USER www

RUN npm init -y
RUN npm install -g n && n 16.17.0
RUN npm install
1

No to zrób tak:

RUN useradd www -u 1000 -ms /bin/bash
RUN usermod -aG sudo www
RUN chown -R www:www /var/www

RUN npm init -y
RUN npm install -g n && n 16.17.0
RUN npm install

USER www
1

Dobra praktyka jest laczenie RUN, COPY i ADD tak zeby miec pojedyncze wywolania:

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#minimize-the-number-of-layers

W przeciwnym wypadku kazde takie wywolanie robi niepotrzebnie nowy layer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1