我從節點 docker 映像創建了一個容器。然后我用 bash 進入容器并嘗試編輯入口點檔案,但我在里面所做的更改沒有得到執行。就像我告訴它在容器的根路徑中創建一個目錄一樣,/app我停止并啟動容器,但更改沒有發生。這是檔案
#!/bin/sh
set -e
mkdir /app
# Run command with node if the first argument contains a "-" or is not a system command. The last
# part inside the "{}" is a workaround for the following bug in ash/dash:
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264
if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then
set -- node "$@"
fi
exec "$@"
uj5u.com熱心網友回復:
當您進行此更改時,入口點腳本已經執行。一個容器運行一個行程,它是入口點腳本;如果不重新運行容器,就無法重新運行它。如果您docker rm使用舊容器和docker run新容器,您對檔案所做的更改將丟失。
作為一般程序的問題,我建議避免“進入容器”。如果您需要在這樣的腳本中進行更改,請在主機上更改它,更改后docker build && docker run的新影像,然后將更改的檔案提交到源代碼管理。如果您更改應用程式代碼,npm test它會在主機上,然后docker build && docker run是一個新映像,并將更新的代碼和單元測驗提交到源代碼控制。
對于您的特定用例,如果容器應始終包含名為 的目錄/app,我建議您在映像的 Dockerfile 中創建它,而不是嘗試在容器啟動時動態創建它。
FROM node:lts
RUN mkdir /app
...
更一般地說,您的影像應包含運行應用程式所需的檔案系統布局和代碼。對于大多數 Node 應用程式,我希望 Dockerfile 看起來像
FROM node:lts
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
CMD node ./index.js
(您還有一個排除主機樹的.dockerignore檔案node_modules。)
Docker 的示例應用程式教程更詳細地描述了這個序列,包括一個不同的基于節點的示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382115.html
