我在网上环顾四周,并尝试了一条明显的路线(如下所述)从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
感谢您的帮助!
答案 0 :(得分:1)
答案 1 :(得分:1)
您需要编辑构建原始映像的Dockerfile。 Dockerfile ENV
directive具有两种不同的语法来设置变量,但没有一种可以取消设置变量。 docker run -e
和Docker 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
本质上不是有害的,但具有大量无用的信息;我很少有理由使用它。