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
调用。如果您同时拥有 ENTRYPOINT
和 CMD
,则 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 .
传递。这将执行入口点脚本中的步骤,包括设置环境,然后打印出环境并立即退出。这样你就可以观察到变化了。
我有一个带有 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
调用。如果您同时拥有 ENTRYPOINT
和 CMD
,则 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 .
传递。这将执行入口点脚本中的步骤,包括设置环境,然后打印出环境并立即退出。这样你就可以观察到变化了。