社内環境下でDockerfileに「RUN npm install -g @vue/cli」すると ECONNREFUSED になった

仕事で使う技術的なこと

社内環境で RUN npm install -g @vue/cli を記載した Dockerfile を使って docker-compose up -d すると ECONNREFUSED と言われて実行できなかったので、その対策の備忘録です。

(なお、別件で network 問題も発生しましたが、これは こちら を参照して解決しました。別件となるのでここでは省略します。)

環境

  • Windows 10 Pro にて Docker Desktop を使用
  • 社内環境下のため、ネットワークはプロキシ配下
    • docker の「Settings – Resources – PROXIS」にて、HTTP および HTTPS プロキシを設定済み
    • OSの環境変数にも http_proxy および https_proxy を設定済み

症状

以下の Dockerfile と docker-compose.yml を使用しました。(前回の記事で使用したものです)

# Dockerfile
FROM node:12.4

RUN apt-get update
RUN npm install -g @vue/cli
RUN npm install -g @aws-amplify/cli

WORKDIR /AmplifyDemo
# docker-compose.yml
version: "3"

services:
  amplify:
    build: ./
    ports:
      - 8000:8000
      - 8081:8080
    stdin_open: true
    volumes:
      - ./dev/:/AmplifyDemo
      - ./dev/aws/:/root/.aws/
    tty: true

上記で docker-compose up -d すると、以下のようになりました。

>docker-compose up -d
Building amplify
[+] Building 137.1s (7/9)
 => [internal] load build definition from Dockerfile                                                                                                                                                                            0.1s 
 => => transferring dockerfile: 32B                                                                                                                                                                                             0.0s 
 => [internal] load .dockerignore                                                                                                                                                                                               0.1s 
 => => transferring context: 2B                                                                                                                                                                                                 0.0s 
 => [internal] load metadata for docker.io/library/node:12.4                                                                                                                                                                    2.5s 
 => [auth] library/node:pull token for registry-1.docker.io                                                                                                                                                                     0.0s 
 => [1/5] FROM docker.io/library/node:12.4@sha256:ff37127378242accaa80c6c3426d02d3f749c7b220401f791eda5c954a60ed75                                                                                                              0.0s 
 => CACHED [2/5] RUN apt-get update                                                                                                                                                                                             0.0s 
 => ERROR [3/5] RUN npm install -g @vue/cli                                                                                                                                                                                   134.3s 
------
 > [3/5] RUN npm install -g @vue/cli:
#7 134.2 npm ERR! code ECONNREFUSED
#7 134.2 npm ERR! errno ECONNREFUSED
#7 134.2 npm ERR! FetchError: request to https://registry.npmjs.org/@vue%2fcli failed, reason: connect ECONNREFUSED 104.16.27.35:443
#7 134.2 npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/node-fetch-npm/src/index.js:68:14)
#7 134.2 npm ERR!     at ClientRequest.emit (events.js:200:13)
#7 134.2 npm ERR!     at TLSSocket.socketErrorListener (_http_client.js:402:9)
#7 134.2 npm ERR!     at TLSSocket.emit (events.js:200:13)
#7 134.3 npm ERR!     at emitErrorNT (internal/streams/destroy.js:91:8)
#7 134.3 npm ERR!     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
#7 134.3 npm ERR!     at processTicksAndRejections (internal/process/task_queues.js:84:9)
#7 134.3 npm ERR!  FetchError: request to https://registry.npmjs.org/@vue%2fcli failed, reason: connect ECONNREFUSED 104.16.27.35:443
#7 134.3 npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/node-fetch-npm/src/index.js:68:14)
#7 134.3 npm ERR!     at ClientRequest.emit (events.js:200:13)
#7 134.3 npm ERR!     at TLSSocket.socketErrorListener (_http_client.js:402:9)
#7 134.3 npm ERR!     at TLSSocket.emit (events.js:200:13)
#7 134.3 npm ERR!     at emitErrorNT (internal/streams/destroy.js:91:8)
#7 134.3 npm ERR!     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
#7 134.3 npm ERR!     at processTicksAndRejections (internal/process/task_queues.js:84:9) {
#7 134.3 npm ERR!   message: 'request to https://registry.npmjs.org/@vue%2fcli ' +
#7 134.3 npm ERR!     'failed, reason: connect ECONNREFUSED ' +
#7 134.3 npm ERR!     '104.16.27.35:443',
#7 134.3 npm ERR!   type: 'system',
#7 134.3 npm ERR!   errno: 'ECONNREFUSED',
#7 134.3 npm ERR!   code: 'ECONNREFUSED',
#7 134.3 npm ERR!   stack: 'FetchError: request to https://registry.npmjs.org/@vue%2fcli failed, ' +
#7 134.3 npm ERR!     'reason: connect ECONNREFUSED 104.16.27.35:443\n    at ' +
#7 134.3 npm ERR!     'ClientRequest.<anonymous> ' +
#7 134.3 npm ERR!     '(/usr/local/lib/node_modules/npm/node_modules/node-fetch-npm/src/index.js:68:14)\n' +
#7 134.3 npm ERR!     '    at ClientRequest.emit (events.js:200:13)\n    at ' +
#7 134.3 npm ERR!     'TLSSocket.socketErrorListener (_http_client.js:402:9)\n    at ' +
#7 134.3 npm ERR!     'TLSSocket.emit (events.js:200:13)\n    at emitErrorNT ' +
#7 134.3 npm ERR!     '(internal/streams/destroy.js:91:8)\n    at emitErrorAndCloseNT ' +
#7 134.3 npm ERR!     '(internal/streams/destroy.js:59:3)\n    at processTicksAndRejections ' +
#7 134.3 npm ERR!     '(internal/process/task_queues.js:84:9)'
#7 134.3 npm ERR! }
#7 134.3 npm ERR!

解決方法

以下の3点を実施すると解決しました。

1.Dockerfile に npm のプロキシ設定を明記する

# Dockerfile
FROM node:12.4

RUN apt-get update
RUN npm config set proxy http://xxxxxxxxx:8080          # ←追加
RUN npm config set https-proxy http://xxxxxxxxx:8080    # ←追加
RUN npm install -g @vue/cli
RUN npm install -g @aws-amplify/cli

WORKDIR /AmplifyDemo

↓参考にさせて頂きました。
https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719

2.docker-compose.yml にもプロキシ設定を明記

これは意外な罠です。
首題の件とは直接は関係ないですが、コンテナ内で amplify init 等するときにプロキシ環境下だと設定しておかないと ECONNREFUSED になります。
気を付けないといけないのは、HTTP_PROXY は大文字である必要があります。
この罠に4時間以上嵌りました・・・

# docker-compose.yml
version: "3"

services:
  amplify:
    build: ./
    ports:
      - 8000:8000
      - 8081:8080
    environment:
      - HTTP_PROXY=http://xxxxxxxxx:8080    # ←これ追加
      - HTTPS_PROXY=http://xxxxxxxxx:8080   # ←これ追加
    stdin_open: true
    volumes:
      - ./dev/:/AmplifyDemo
      - ./dev/aws/:/root/.aws/
    tty: true

↓参考にさせて頂きました。
https://twitter.com/wadahiro/status/1303526058155622400

3.Docker Desktop の Docker Engine 設定を変更

Docker Engine の設定の insecure-registriesdocker.io を追加します。

↓参考にさせて頂きました。
https://cream-worker.blog.jp/archives/1079086929.html

コメント

タイトルとURLをコピーしました