从Docker映像中删除环境变量

时间:2019-03-22 00:42:39

标签: docker ubuntu environment-variables

我在网上环顾四周,并尝试了一条明显的路线(如下所述)从Docker镜像中删除环境变量。

1-我使用以下方法从修改过的ubuntu映像创建容器:

docker run -it --name my_container my_image

2-我检查图像并查看要使用的两个环境变量:

docker inspect my_container

产生:

...
    "Env": [
        "env_variable_1=abcdef",
        "env_variable_2=ghijkl",
        "env_variable_3=mnopqr",
...

3-我执行到容器并通过以下方式删除环境变量:

docker exec -it my_container bash
unset env_variable_1
unset env_variable_2

4-我检查以确保指定的变量不存在:

docker inspect my_container

产生:

...
    "Env": [
        "env_variable_3=mnopqr",
...

5-然后我通过以下方式将此修改后的容器作为映像提交:

docker commit my_container my_new_image

6-并通过以下方法检查是否存在已删除的环境变量:

docker run -it --name my_new_container my_new_image
docker inspect my_new_container

产生(请打鼓):

...
    "Env": [
        "env_variable_1=abcdef",
        "env_variable_2=ghijkl",
        "env_variable_3=mnopqr",
...

AKA删除的变量不会从修改后的容器传送到docker commit中的新映像

我在这里错过了什么? unset是否真的删除了变量?我应该使用其他方法删除这些环境变量还是使用另一种/修改后的方法将容器提交为图像?

PS:我已经通过env确认了变量在容器中时首先存在。然后,我确认使用unset my_variable

后,它们是否使用相同的方法不活动

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

也许您可以尝试使用这种方式,例如this answer

docker exec -it -e env_variable_1 my_container bash

然后像往常一样提交容器。

答案 1 :(得分:1)

您需要编辑构建原始映像的Dockerfile。 Dockerfile ENV directive具有两种不同的语法来设置变量,但没有一种可以取消设置变量。 docker run -eDocker Compose environment: setting也无法做到这一点。这不是一个特别常见的用例。

根据需要,将变量设置为空值就足够了,尽管这在技术上有所不同。

FROM my_image
ENV env_variable_1=""
RUN test -z "$env_variable_1" && echo variable 1 is empty
RUN echo variable 1 is ${env_variable_1:-empty}
RUN echo variable 1 is ${env_variable_1-unset}
# on first build will print out "empty", "empty", and nothing

最大的麻烦是使用入口点脚本来取消设置变量。该脚本如下所示:

#!/bin/sh
unset env_variable_1 env_variable_2
exec "$@"

它将与Dockerfile配对,例如:

FROM my_image
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["same", "as", "before"]

docker inspect仍将变量显示为已设置状态(因为它位于容器元数据中),但是类似ps e的变量显示容器进程的实际环境将显示该变量未设置。

作为一般规则,应始终使用docker build系统创建图像,并且从不使用docker commit。 (“修改后的Ubuntu映像”实际上不是可重现的配方,用于调试或寻求帮助,或者在六个月内出现关键安全补丁时用于重建它。)docker inspect本质上不是有害的,但具有大量无用的信息;我很少有理由使用它。