传递给docker的环境变量运行

时间:2016-09-14 14:57:31

标签: docker environment-variables

我有一个可以部分准备工作的泊坞窗图像。要让它完全正常工作,我必须运行

sudo docker run -d -p 80 --name myimage -e ADMIN_USER="user1" -e ADMIN_PASSWORD='password1' leonixyz/myimage:1.0

第一次执行图像时,我的代码会在里面配置应用程序。

这很方便,因为每次我需要一个新的应用程序实例(每次都必须为不同的用户配置)时,我可以将不同的环境变量传递给docker run,我的代码将专门配置容器对于新用户。

不幸的是,我看到这些变量无法从容器中删除。

如果我这样做:

sudo docker exec -it <container_id> bash

然后我可以看到变量ADMIN_USERADMIN_PASSWORD(显然)仍在那里。

我在我的一次性配置代码的末尾尝试unset ADMIN_PASSWORD,但它不起作用。

同样在正在运行的容器中从bash shell运行unset ADMIN_PASSWORD将无效。

有没有办法从容器中删除环境变量?一旦启动它?

由于

修改 正如所指出的那样,最好不要通过环境变量传递秘密,这里解释了一个很好的解决方法https://github.com/docker/docker/issues/13490#issuecomment-162125128

4 个答案:

答案 0 :(得分:3)

“取消设置”保存凭据的环境变量的唯一合理方法是不首先设置它们。一般来说,不要将环境变量用于凭证或“秘密”。

以下提供了一个很好的摘要:https://github.com/docker/docker/issues/13490

答案 1 :(得分:0)

相反的做法呢?您可以将入口点设置为以下内容,而不是在运行时传递环境变量:

    ENTRYPOINT export ADMIN_USER="user1" \
               && export ADMIN_PASSWORD='password1' \
               && entrypoint.sh

另一种方法是将所需的变量作为实际参数传递给入口点脚本。

答案 2 :(得分:0)

如果您必须设置env var(无论出于何种原因),现在Dockerfile best practices中都会介绍。

FROM alpine
RUN export ADMIN_USER="mark" \
    && echo $ADMIN_USER > ./mark \
    && unset ADMIN_USER
CMD sh

答案 3 :(得分:0)

您现在可以(2020年9月)通过变量传递变量,这些变量将不属于最终图像,

docker build --no-cache --progress=plain --secret id=mysecret,src=mysecret.txt

与Dockerfile关联

# shows secret from default secret location:
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

这使用docker build with BuildKit

有关“ Docker and securing passwords”的更多信息。