build镜像的时候用ENV
命令的确会添加环境变量。这样做的效果就是在docker run -it image_name
或者docker attach container_name
的时候,是可以查到ENV的。
但是某种情况下,使用ssh从其他地方访问容器时,会发现ENV消失了。这是因为每次ssh都会source .profile
从而导致在shell中的环境变量被覆盖调,或者说Docker的环境变量不是持久的。
有没有方式可以解决这个问题呢?答案是有的。
首先创建一个env.Dockerfile
文件,这个文件用于存储共有的环境变量
ENV SCALA_HOME=/usr/share/scala
ENV HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
ENV SPARK_HOME=/usr/local/spark
ENV PATH=$PATH:/usr/local/spark/bin
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
然后创建脚本add_env.py
#!/usr/bin/env python
import sys
import os
from pathlib import Path
file=sys.argv[1]
print(f'file = {file}')
target_line='# auto add env'
txt=Path(file).read_text()
lines=txt.splitlines()
if target_line in lines:
ix=lines.index(target_line)
lines=lines[:ix+1]
env_lines=Path('env.Dockerfile').read_text().splitlines()
lines=lines+[target_line]+env_lines
Path(file).write_text('\n'.join(lines))
对于需要添加环境变量的Dockerfile,请确保有以下两行
ADD env.Dockerfile /tmp/env.Dockerfile
RUN sed -e "s/ENV/export/" /tmp/env.Dockerfile >> /root/.profile
在终端执行./add_env.py Dockerfile
, 就可以动态地将env.Dockerfile
中的内容拼接到Dockerfile
中。