【问题标题】:How come when I edit the /usr/local/bin/docker-entrypoint.sh file nothing happens?当我编辑 /usr/local/bin/docker-entrypoint.sh 文件时,为什么没有任何反应?
【发布时间】:2022-01-18 07:05:30
【问题描述】:

我从节点 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 "$@"

【问题讨论】:

    标签: docker docker-container


    【解决方案1】:

    当您进行此更改时,入口点脚本已经执行。一个容器运行一个进程,它是入口点脚本;如果不重新运行容器,就无法重新运行它。如果您 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
    

    (您还有一个不包括主机的 node_modules 树的 .dockerignore file。)

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

    【讨论】:

    • 那么CMD是每次容器启动或重启时运行的东西?如果目录不存在,WORKDIR 命令是否还会创建该目录?如果我不应该进入容器,我在开发时如何编辑源代码?
    • (1) 是的,CMD 是容器运行的单个进程。 (2) 是的,WORKDIR 创建目录。 (3) 由于 Docker 容器有自己的与主机系统隔离的文件系统,我认为它不适合开发环境。特别是对于 Node,我遇到了几个版本不兼容的问题,直接在主机上安装非常容易,所以我会使用主机 Node 环境进行日常开发。
    • 所以你只会在开发完成后使用容器?
    • 对集成测试也很有用;并且您可以将非容器主机开发环境与基于容器的数据存储结合使用(在容器中运行 PostgreSQL 和 Redis,但在主机上进行开发)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2017-12-26
    • 2019-12-08
    相关资源
    最近更新 更多