Docker 入口点脚本不是源文件

Docker entrypoint script not sourcing file

我有一个带有 docker 的入口点脚本正在执行。但是,运行 source 命令无法获取充满 env 值的文件。

这是来自docker文件

的相关部分
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["-production"]

我已经尝试了 2 个版本的入口点脚本。他们都没有工作。

版本 1

#!/bin/bash

cat >> /etc/bash.bashrc <<EOF
if [[ -f "/usr/local/etc/${SERVICE_NAME}/${SERVICE_NAME}.env" ]]
then
  echo "${SERVICE_NAME}.env found ..."
  set -a
  source "/usr/local/etc/${SERVICE_NAME}/${SERVICE_NAME}.env"
  set +a
fi
EOF

echo "INFO: Starting ${SERVICE_NAME} application, environment:"

exec -a $SERVICE_NAME node .

版本 2

ENV_FILE=/usr/local/etc/${SERVICE_NAME}/${SERVICE_NAME}.env
if [[] -f "$ENV_FILE" ]; then
  echo "INFO: Loading environment variables from file: ${ENV_FILE}"
  set -a
  source $ENV_FILE
  set +a
fi

echo "INFO: Starting ${SERVICE_NAME} application..."

exec -a $SERVICE_NAME node .

上面的版本 2 打印到它已找到文件的日志,但是,source 命令根本没有将文件的内容加载到内存中。我检查内容是否已通过 运行ning env 命令加载。

我已经尝试了 3 天的一些事情,但没有任何进展。有人可以帮我吗?请注意,我是 docker 的新手,这让事情变得非常困难。

我想你的第二个版本快到了。

通常 Docker 根本不读取或使用 shell 点文件。这对 Docker 来说并不是什么特别的事情,只是您在序列中的任何时候都没有 运行 宁“互动”或“登录” shell。在你的第一个表单中,你写了一个 .bashrc 文件,然后 exec node,并且什么都没有 re-reads 点文件。

你在问题中提到你使用env命令来检查环境。如果这是通过 docker exec,那会在容器内启动一个新进程,但它不是入口点脚本的子进程,因此发生的任何设置对 docker exec 都是不可见的。这通常不是问题。

我可以建议进行一些清理,这样可以更轻松地查看其效果。最大的是从入口点脚本中分离出 node 调用。如果您同时拥有 ENTRYPOINTCMD,则 Docker passes the CMD as arguments to the ENTRYPOINT;如果您将入口点脚本更改为以 exec "$@" 结尾,那么它将 运行 无论它通过什么。

#!/bin/sh
# (trying to avoid bash-specific constructs)

# Read the environment file
ENV_FILE="/usr/local/etc/${SERVICE_NAME}/${SERVICE_NAME}.env"
if [[ -f "$ENV_FILE" ]; then
  . $ENV_FILE
fi

# Run the main container command
exec "$@"

然后在 Docker 文件中,将 node 调用作为主要命令

ENTRYPOINT ["./entrypoint.sh"] # must be JSON-array syntax
CMD ["node", "."]              # could be shell-command syntax

重要的是很容易覆盖命令但保持入口点不变。所以如果你 运行

docker run --rm your-image env

这将启动一个临时容器,但将 env 作为命令而不是 node . 传递。这将执行入口点脚本中的步骤,包括设置环境,然后打印出环境并立即退出。这样你就可以观察到变化了。