надеюсь, что этот ответ может вам помочь. Я фактически выполнил создание изображения nodejs CentOs на основе фактического изображения nodejs docker. Если вы перейдете по следующей ссылке, вы увидите, как создается изображение узла docker:
узел docker официальное изображение
Первая часть узла image запускает команды для создания пользователя «узла», и я не могу не подчеркнуть, насколько хорошо с точки зрения безопасности выполняется запуск ваших контейнеров узлов от другого пользователя, который не является «root». Вторая часть - это та часть, которая, я верю, поможет вам; Во всем этом коде у вас есть часть, в которой вы обмениваетесь ключами gpg с сервером, и сразу после этого, в зависимости от вашей архитектуры, программа nodejs загружается с официальной страницы nodejs и готовится к запуску. Я думаю, что ваша основная проблема заключается не в импорте ключей на сервер, там на изображении вы должны найти ответ.
Кроме того, на изображении есть часть, отвечающая за определение вашей архитектуры, но в основном большинство архитектуры будут "x64". Я включаю вам образ узла на основе CentOs (на основе официального образа узла, который я связал с вами), чтобы вы могли его посмотреть:
FROM centos:centos8
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid node --shell /bin/bash --create-home node
# node install taken from the node oficial image
ENV NODE_VERSION=12.16.3
RUN set -ex \
&& for key in \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
77984A986EBC2AA786BC0F66B01FBB92821C587A \
8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
4ED778F539E3634C779C87C6D7062848A1AB005C \
A48C2BEE680E841632CD4E44F07496B3EB3C1762 \
B9E2F5981AA6E0CD28160D9FF13993A75599653C \
; do \
gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \
gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \
gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \
done \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs \
# smoke tests
&& node --version \
&& npm --version
CMD [ "node" ]
ДРУГАЯ ИНФОРМАЦИЯ Здесь я хочу дать вам к другим пунктам, которые могут вам помочь в вашем Dockerfile, но не отвечайте прямо на ваш ответ (поэтому я поставил его до конца):
Я могу полагать, что у вас есть свои причины, но официальный образ nodejs docker на самом деле основан на debian (если вы не выберете alpine), поэтому вы можете решить свою проблему напрямую, используя FROM nodejs:<version_you_want>
. Повторяю, может быть, у вас есть веская причина так поступать, но дать совет не помешает :)
Это не считается хорошей практикой (я поставлю ссылку после этого абзаца на ссылку), чтобы использовать «npm» для запуска образа узла по следующим причинам:
- Процесс npm запускает подпроцесс узла, поэтому вы должны обрабатывать для запуска вашего приложения.
Процесс npm имеет известную (не очень известную) проблему, которая называется: «Проблема PID 1». Как Брет Фишер, капитан и консультант docker, заявляет в следующей статье:
Я рекомендую вызывать двоичный файл узла напрямую, в основном из-за «проблемы PID 1» ... Node.js принимает и пересылает такие сигналы, как SIGINT и SIGTERM, из ОС, что важно для правильного завершения работы вашего приложения. Node.js оставляет на усмотрение вашего приложения, как обрабатывать эти сигналы, а это означает, что если вы не пишете код или не используете модуль для их обработки, ваше приложение не завершится корректно. Он проигнорирует эти сигналы, а затем будет уничтожен Docker или Kubernetes после периода ожидания.
Лучше запускать двоичный файл «node» напрямую. Как сказано в статье, npm не обрабатывает сигналы SIGTERM / SIGINIT, и узел также не обрабатывает их. Разница в том, что вы можете добавить код в узел для обработки этих сигналов.
Я включаю проблему node vs npm, она входит в последнюю часть статья, и в ней также есть много хороших nodejs docker практик :)
держать nodejs рок в палубе
Надеюсь, это поможет вам разрешить ваши сомнения и помогли вам еще немного улучшить передовой опыт. Если у вас или у кого-то есть какие-либо сомнения, не сомневайтесь, разместите это в комментариях, и я буду рад помочь, если смогу.
Хорошего дня!