Я пытаюсь создать образ Docker для своего приложения Sails.js. Вот Dockerfile:
FROM risingstack/alpine:3.4-v8.5.0-4.7.0
ENV NODE_ENV test
RUN npm install -g sails
COPY npmrc_file .npmrc
ARG NPM_TOKEN
COPY package.json package.json
RUN npm install
RUN rm -f .npmrc
# Add your source files
COPY . .
EXPOSE 3000
CMD ["npm","start"]
Я сделал шаги для этого Dockerfile из эта ссылка на сайте документации NPM. Я убедился, что идеально соответствует тому, что там показано в документации.
Моя команда сборки докера:
image = "my-repo-url/tagname:tagversion"
docker build --build-arg NPM_TOKEN=my-token-goes-here -t $image -f Dockerfile .
Затем я запускаю контейнер с образом с помощью docker stack
или docker-compose
. Контейнер не запускается из-за следующей ошибки:
sails_1 | Error: Failed to replace env in config: ${NPM_TOKEN}
sails_1 | at /usr/lib/node_modules/npm/lib/config/core.js:418:13
sails_1 | at String.replace (<anonymous>)
sails_1 | at envReplace (/usr/lib/node_modules/npm/lib/config/core.js:414:12)
sails_1 | at parseField (/usr/lib/node_modules/npm/lib/config/core.js:392:7)
sails_1 | at /usr/lib/node_modules/npm/lib/config/core.js:335:17
sails_1 | at Array.forEach (<anonymous>)
sails_1 | at Conf.add (/usr/lib/node_modules/npm/lib/config/core.js:334:23)
sails_1 | at ConfigChain.addString (/usr/lib/node_modules/npm/node_modules/config-chain/index.js:244:8)
sails_1 | at Conf.<anonymous> (/usr/lib/node_modules/npm/lib/config/core.js:322:10)
sails_1 | at /usr/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:78:16
sails_1 | /usr/lib/node_modules/npm/lib/npm.js:52
sails_1 | throw new Error('npm.load() required')
sails_1 | ^
sails_1 |
sails_1 | Error: npm.load() required
sails_1 | at Object.get (/usr/lib/node_modules/npm/lib/npm.js:52:13)
sails_1 | at process.errorHandler (/usr/lib/node_modules/npm/lib/utils/error-handler.js:213:18)
sails_1 | at emitOne (events.js:115:13)
sails_1 | at process.emit (events.js:210:7)
sails_1 | at process._fatalException (bootstrap_node.js:399:26)
Дело в том, что к тому времени, когда мы приступим к запуску контейнера, не должно быть никаких ссылок на $ {NPM_TOKEN} или необходимости в нем. Я использую точно такую же настройку в другом проекте и не вижу этой ошибки, поэтому я не совсем уверен, в чем дело. Я трижды проверил, что в этом проекте все так же, как и в другом.
Каковы возможные причины этой ошибки и возможные решения?
Я также прочитал эта ветка и этот ТАК вопрос. Мне кажется, все, что я прочитал, указывало на то же решение, которое я реализовал, но безуспешно.
Вот что у меня сработало в итоге:
ARG NPM_TOKEN
ENV NPM_TOKEN = "${NPM_TOKEN}"
Почему это решило эту проблему, я не уверен!
Это то, что я использую,
в Dockerfile
ARG NPM_AUTH_TOKEN=$NPM_AUTH_TOKEN
ENV NPM_AUTH_TOKEN=$NPM_AUTH_TOKEN
и в docker-compose.yml
version: '2'
services:
app:
build:
args:
- NPM_AUTH_TOKEN
Здесь вы можете найти мое решение stackoverflow.com/a/67648863/14178236