【问题标题】:Env file not properly sourced from entrypoint script未从入口点脚本正确获取 Env 文件
【发布时间】:2018-09-23 12:04:45
【问题描述】:

我正在尝试从条件 entrypoint.sh 脚本中获取 .env 文件,其中一部分看起来像这样:

if [ -f "some-env-file.env" ]; then
source some-env-file.env

在.env文件中找到一个环境变量的简单回显,就在上述源命令之后,输出正确的值,并且入口点脚本中提供的操作成功执行。

但是,当我在实例化容器内执行 docker exec -it 时,env 文件看起来好像没有来源。只有当我从那里再次采购时,我才能得到理想的结果。 (更具体地说,env文件用于指向python的特定运行时环境。所以进入容器后,只有当我再次source env文件时才能正确调用python。

我做错了什么?

作为参考,这些是我的 Dockerfile 的最后几行(没什么特别的):

COPY ./entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]

容器实例化是使用docker-compose yaml 完成的。

提前致谢,如果之前有人问过这个问题,我们深表歉意。

【问题讨论】:

  • entrypoint.sh的shebang是什么?
  • 这里是:#!/bin/bash
  • 如果您将set -x 添加到entrypoint.sh 的顶部(但在shebang 之后)并尝试,它看起来是否至少尝试 来获取文件?
  • 也许我不够清楚。在入口点脚本中,var 的来源是正确的,并且容器的功能是正确的。不正确的是,当我在容器内执行时,env vars 就好像它们没有来源一样。例如,在调用 java 时出现“找不到命令”,同时它来自入口点脚本。
  • 啊,好的。但是,为什么起作用呢?如果entrypoint.sh 获取文件并对环境进行更改,则只有 环境会受到影响(可能还有子进程的环境)。

标签: shell docker docker-compose dockerfile docker-entrypoint


【解决方案1】:

Docker 启动流程是 Docker 设置一些环境变量(来自 Dockerfile 和docker run -e 选项),然后启动容器的入口点。入口点内发生的任何事情都超出了 Docker 的权限范围。特别是,通过docker exec 启动的调试shell 不是入口点的子级,并且不会继承在那里设置的环境变量。 (注意:我无法在任何地方的 Docker 文档中找到明确说明。)

一个很好的尝试是运行:

% docker run -d --name test busybox sh -c 'sleep 60; sleep 60'
6c6aada7e5299e816e9d12dfab9845cc396485a46d909255375128b87ee5eedf
% docker exec test ps -o pid,ppid,comm
PID   PPID  COMMAND
    1     0 sh
    6     1 sleep
    7     0 ps

容器的根进程是一个shell,它的进程ID为1,它启动一个sleep子进程,进程ID为6,父进程ID为1。docker execps命令得到一个新的进程ID,但人工父进程 ID 为 0——它不是容器根进程的子进程。

如果你想调试你的镜像的启动环境,使用典型的入口点脚本,比如

#!/bin/sh
. /env.sh
exec "$@"

您可以docker run --rm -it myimage sh 并且生成的shell 将通过您的入口点脚本启动。但正如您所观察到的,尝试通过 docker exec 对其进行调试不会经过入口点序列的任何部分。

【讨论】:

    【解决方案2】:

    将此添加到我的entrypoint.sh 解决了问题:

    cat >> /etc/bash.bashrc <<EOF
    if [ -f some-env-file.env ]; then
      source some-env-file.env
    fi
    EOF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 2014-09-23
      • 2014-06-28
      • 2021-11-07
      • 1970-01-01
      • 2022-12-18
      • 2017-05-04
      • 2022-01-03
      相关资源
      最近更新 更多