【问题标题】:Docker: how to unset the environment variable in container which is provided by `docker run -e FOO=bar` command?Docker:如何取消设置由`docker run -e FOO = bar`命令提供的容器中的环境变量?
【发布时间】:2020-07-03 07:40:39
【问题描述】:

例如,我有一个 dockerfile,它有一个 ENTRYPOINT 命令:

From alpine:latest
WORKDIR /app/
RUN apk add --no-cache bash && echo 'echo foo:$FOO' > echo.sh && cat echo.sh && chmod a+x echo.sh 

ENTRYPOINT ["sh", "-c", "_FOO=$FOO ./echo.sh && unset FOO && sleep 30"]

然后我运行这个 docker 并传递 env FOO 和值 bar:

$ docker run --rm -e FOO=bar --name=demo docker-image-demo

如何取消设置docker run -e FOO=bar命令提供的容器中的环境变量FOO

$ docker exec -it demo bash
$ bash-5.0$ echo $FOO
bar

我尝试使用exec 将容器进程替换为bash,但出现一些错误:

ENTRYPOINT ["exec", "sh", "-c", "_FOO=$FOO ./echo.sh && unset FOO && sleep 30"]

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:344:启动容器进程导致“exec:“exec”:$PATH 中找不到可执行文件:未知。

【问题讨论】:

  • 我自己从来不需要这个。你隐藏它的目的是什么?如果有人已经在容器内,他们一定知道那个值(大概只有一个秘密值得隐藏;)。
  • @mirekphd 这个 FOO 存储了 http-server 的秘密。如docker run -e PASSWORD./http-server && unset PASSWORD && sleep 300000

标签: docker


【解决方案1】:

我会为此使用docker secret。通过 env 变量向容器注入秘密是完全可以接受的——即使是经过安全加固的 Openshift 也允许在其模板中这样做。

如果攻击者已经在服务器容器内,那么他们一定是破解了您试图隐藏在这里的密码。或者他们获得了对您机器的访问权限并可以执行 docker 命令(docker 组密码通常与sudo 处于同一级别,因此这意味着您已被黑到 root 级别)或者在 Openshift 的情况下拥有您的 CLI 密码,因此他们可以连接到您命名空间中所有其他容器中的远程 shell 并做任何他们想做的事情。所以现在隐藏环境变量似乎为时已晚。

【讨论】:

    【解决方案2】:

    您可以使用内置的unset shell 执行此操作,就像您正在执行的操作一样。

    但是:docker exec shell 不会作为入口点的子级运行,因此入口点对环境所做的任何更改对这些 shell 都不可见。这通常不是一个实际问题,因为您通常应该保留 docker exec 用于偶尔的调试任务。

    查看此问题的一种方法是编辑 Dockerfile 以在 unset 命令之后再次运行 echo.sh 脚本。


    您还可以对其进行重组以使用入口点包装脚本,并尊重 Docker CMD。例如,我们可以将当前ENTRYPOINT 行中的长命令重写为脚本:

    #!/bin/sh
    
    # Do any first-time setup that's required
    echo "FOO was '$FOO'"
    unset FOO
    echo "FOO is now '$FOO'"
    
    # Then run the main container command, replacing this script
    exec "$@"
    

    然后您可以在 Dockerfile 中调用它:

    FROM alpine:latest
    # RUN apk add --no-cache bash
    WORKDIR /app
    COPY echo.sh entrypoint.sh .  # will preserve executable bit
    
    # Must use JSON-array syntax; must not use `sh -c` wrapper
    ENTRYPOINT ["/app/entrypoint.sh"]
    # Can be anything
    CMD sleep 30
    

    现在,如果您构建此映像,您可以使用备用命令docker run 它。例如,如果您只想查看主容器进程将运行的环境,您可以

    docker run --rm docker-image-demo env
    

    【讨论】:

    • 如果我运行docker exec -it <contanier>,我仍然可以找到 FOO 的值。
    猜你喜欢
    • 2018-04-29
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2022-12-13
    • 1970-01-01
    • 2016-09-08
    • 2017-03-18
    相关资源
    最近更新 更多