私のDockerfileはAlpineを使用しており、react-scriptsをグローバルにインストールしています。インストールしようとすると、「uid/gidを取得できませんでした」というエラーで失敗します。 npm install -gコマンドに「--- unsafe-perm」オプションを追加しました。 Dockerコンテナは正常に作成されますが、コンテナ内の権限はインストールされたファイルに対してメッセージで通知されます。すべてのユーザー名とグループが1000に設定されています。インストール手順の直前にDockerfileに次のコマンドを追加しようとしましたが、助けにはなりませんでした。
RUN npm -g config set user root
ビルドエラー
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;"]
これが nodejs/docker-node問題813 にリンクされているかどうかを確認します。
根本的な原因は次のようです: スレッドスタックサイズ
glibc
の新しいスレッドのデフォルトスタックサイズは、メインスレッドのスタックを管理するリソース制限に基づいて決定されます(RLIMIT_STACK
)。
通常は2〜10 MBになります。次の3つの解決策があります。
- Alpineチームに相談して修正してください。すでにいくつかの議論がありました
- 次のように node docker Alpineイメージで修正します
- デフォルト設定
npm_config_unsafe_perm=true
を修正するまでの回避策として、Dockerイメージに追加します。
すでに3番目のオプションを試しましたが、次のことも考慮してください。
または、Alpineチームがこのgetを修正するまで、スリム(Debian)バリアントに切り替える必要があります。
反応アプリケーションをドッキングしているときに、ノードアルパインイメージのDockerで同じ問題に直面しました
次のdockerfile構成で解決しました。
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"]