为什么我编辑 /usr/local/bin/docker-entrypoint.sh 文件时没有任何反应?

How come when I edit the /usr/local/bin/docker-entrypoint.sh file nothing happens?

我从节点 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#-}" != "" ] || [ -z "$(command -v "")" ] || { [ -f "" ] && ! [ -x "" ]; }; then
  set -- node "$@"
fi

exec "$@"

当您进行此更改时,入口点脚本已经执行。一个容器运行s 一个进程,它是入口点脚本;如果不重新 运行 容器,就无法重新 运行 它。如果您 docker rm 旧容器和 docker run 新容器,您对文件所做的更改将会丢失。

作为一般流程,我建议避免“进入容器”。如果您需要在这样的脚本中进行更改,请在主机上进行更改,docker build && docker run 更改后的新图像,然后将更改后的文件提交到源代码管理。如果您更改应用程序代码,npm test 它在主机上,然后 docker build && docker run 一个新图像,并将更新的代码和单元测试提交到源代码管理。

对于您的特定用例,如果容器应始终包含一个名为 /app 的目录,我建议您在图像的 Docker 文件中创建它,而不是尝试在容器启动。

FROM node:lts
RUN mkdir /app
...

更一般地说,您的图像应包含 运行 您的应用程序所需的文件系统布局和代码。对于大多数 Node 应用程序,我希望 Docker 文件看起来像

FROM node:lts
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
CMD node ./index.js

(您还有一个 .dockerignore file 排除了主机的 node_modules 树。)

Docker 的 Sample application 教程更详细地描述了这个序列,包括一个不同的基于节点的示例。