web-dev-qa-db-ja.com

docker:新しいユーザーを作成した後にnpminstallを実行する際に問題が発生する

したがって、 この投稿 に従って、CoreOS上のDockerの下にnode.jsベースのフレームワークをインストールすることに関する別のフォローアップの質問があります。

したがって、npmpackage.jsonからroot経由でインストールするのが面倒なので、パッケージをインストールするには、root以外のSudoユーザーを作成する必要がありました。これは私のDockerfileが現在私たちのリポジトリ内でどのように見えるかであり、ubuntuイメージから構築されています:

# Install dependencies and nodejs
RUN apt-get update
RUN apt-get install -y python-software-properties python g++ make
RUN add-apt-repository ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get install -y nodejs

# Install git
RUN apt-get install -y git

# Bundle app source
ADD . /src

# Create a nonroot user, and switch to it
RUN /usr/sbin/useradd --create-home --home-dir /usr/local/nonroot --Shell /bin/bash nonroot
RUN /usr/sbin/adduser nonroot Sudo
RUN chown -R nonroot /usr/local/
RUN chown -R nonroot /usr/lib/
RUN chown -R nonroot /usr/bin/
RUN chown -R nonroot /src

USER nonroot

# Install app source
RUN cd /src; npm install

私はこれが物事を行うためのエレガントでない方法であることを知っていますが、そうでなければ、ここでnpmインストールを完了する方法について途方に暮れています。上記を試してみると、すべてのパッケージをインストールしようとするとエラーが発生します。

 Error: Attempt to unlock [email protected], which hasn't been locked
     at unlock (/usr/lib/node_modules/npm/lib/cache.js:1304:11)
     at cb (/usr/lib/node_modules/npm/lib/cache.js:646:5)
     at /usr/lib/node_modules/npm/lib/cache.js:655:20
     at /usr/lib/node_modules/npm/lib/cache.js:1282:20
     at afterMkdir (/usr/lib/node_modules/npm/lib/cache.js:1013:14)
     at /usr/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53
     at Object.oncomplete (fs.js:107:15)
 If you need help, you may report this *entire* log,
 including the npm and node versions, at:
     <http://github.com/npm/npm/issues>

 ...

Dockerfileをどのように変更する必要があるかについて何か考えはありますか?これは、Dockerフレームワークに固有の可能性がある上記のnonrootユーザーをプロビジョニングした方法に関係するいくつかの許可の問題であると推測できます。スクリプトからではありませんが、Vanillaubuntuのインストールだけでこの種のことを行うのに問題はありません。

8
fox

したがって、これは dockerの問題 である可能性があることがわかります。

代わりにUSER nonrootからRUN /bin/su nonrootに切り替えることでこれを回避できましたが、その後はすべて正常に機能しました。

10
fox

ヨーマンプロジェクトを作成しようとしたときに同様の間違いを犯し、最終的に解決策を見つけました:)

ホームディレクトリの.npmフォルダの所有者が「root」ユーザーだったため、このエラーが発生していました。

Sudo chown [username] .npm

そして今、私はエラーなしでヨーマンとnpmを使うことができます:)

それが役に立てば幸い!

変更/提案についていくつか提案があります。

  • 次のようなものを使用して、ノードモジュールをDockerfileの早い段階でキャッシュします(これをapt-getの直後に配置します。

    ADD package.json /tmp/package.json
    RUN cd /tmp && npm install
    RUN mkdir -p /src && cp -a /tmp/node_modules /src
    

    このように、アプリケーションコードが変更された場合、毎回すべてのノードモジュールを再構築するわけではありません。これをADD . /srcの前に置いてください。詳細/例は 私のブログ投稿 記事にあります。

  • デフォルトであるDockerfile...でrootとして実行することを心配する必要はありません。おそらく、問題はルートに関連しているのではなく、ホストのディレクトリ内のコンテンツに関連しています。コードのディレクトリからロックファイルをクリーンアップする必要があるかもしれませんか?

5
insitusec