Mon Dockerfile utilise Alpine et installe globalement des scripts de réaction. Lorsqu'il essaie de l'installer, il échoue avec l'erreur "Impossible d'obtenir uid/gid". J'ai ajouté l'option "--- unsafe-perm" à la commande npm install -g. Le conteneur Docker est créé avec succès, mais les autorisations dans le conteneur sont envoyées pour les fichiers installés. Je vois le nom d'utilisateur et le groupe définis sur 1000 pour chacun d'eux. J'ai essayé d'ajouter la commande suivante au Dockerfile juste avant l'étape d'installation, mais cela n'a pas aidé.
RUN npm -g config set user root
Erreur de build
Error: could not get uid/gid
[ 'nobody', 0 ]
at /usr/local/lib/node_modules/npm/node_modules/uid-number/uid-number.js:37:16
at ChildProcess.exithandler (child_process.js:296:5)
at ChildProcess.emit (events.js:182:13)
at maybeClose (internal/child_process.js:961:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:250:5)
TypeError: Cannot read property 'get' of undefined
at errorHandler (/usr/local/lib/node_modules/npm/lib/utils/error-handler.js:205:18)
at /usr/local/lib/node_modules/npm/bin/npm-cli.js:76:20
at cb (/usr/local/lib/node_modules/npm/lib/npm.js:228:22)
at /usr/local/lib/node_modules/npm/lib/npm.js:266:24
at /usr/local/lib/node_modules/npm/lib/config/core.js:83:7
at Array.forEach (<anonymous>)
at /usr/local/lib/node_modules/npm/lib/config/core.js:82:13
at f (/usr/local/lib/node_modules/npm/node_modules/once/once.js:25:25)
at afterExtras (/usr/local/lib/node_modules/npm/lib/config/core.js:173:20)
at Conf.<anonymous> (/usr/local/lib/node_modules/npm/lib/config/core.js:231:22)
/usr/local/lib/node_modules/npm/lib/utils/error-handler.js:205
if (npm.config.get('json')) {
^
TypeError: Cannot read property 'get' of undefined
at process.errorHandler (/usr/local/lib/node_modules/npm/lib/utils/error-handler.js:205:18)
at process.emit (events.js:182:13)
at process._fatalException (internal/bootstrap/node.js:472:27)
ERROR: Service 'sample-app' failed to build: The command '/bin/sh -c npm install [email protected] -g' returned a non-zero code:
Dockerfile
/usr/src/app # cat Dockerfile
# build environment
FROM node:10-Alpine as builder
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install [email protected] -g
COPY . /usr/src/app
RUN npm run build
# production environment
FROM nginx:1.13.9-Alpine
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Vérifiez si cela est lié à nodejs/docker-node issue 81 :
La cause première semble être: taille de la pile de threads
La taille de pile par défaut pour les nouveaux threads sur
glibc
est déterminée en fonction de la limite de ressources régissant la pile du thread principal (RLIMIT_STACK
).
Il finit généralement par être de 2 à 10 Mo.Il y a trois solutions possibles:
- Parlez aux équipes alpines pour le réparer. Il y avait quelques discussions déjà
- Fixez-le dans l'image nœud Docker Alpine comme suit
- Définir par defaut
npm_config_unsafe_perm=true
dans l'image de docker comme solution de contournement jusqu'à ce qu'elle soit corrigée.
Vous avez déjà essayé la troisième option, mais envisagez également:
Alternativement, vous devriez passer à la variante slim (Debian) jusqu'à ce que cela soit fixé en amont par l'équipe Alpine.
J'ai rencontré le même problème dans Docker pour l'image de nœud alpin lorsque je dockerise mon application React
J'ai résolu la configuration de dockerfile suivante.
FROM node:8.10.0-Alpine
# Set a working directory
WORKDIR /usr/src/app
COPY ./build/package.json .
COPY ./build/yarn.lock .
# To handle 'not get uid/gid'
RUN npm config set unsafe-perm true
# Install Node.js dependencies
RUN yarn install --production --no-progress
# Copy application files
COPY ./build .
# Install pm2
RUN npm install -g pm2 --silent
# Run the container under "node" user by default
USER node
CMD ["pm2", "start", "mypm2config.yml", "--no-daemon", "--env", "preprod"]