dockerfile 中的 env 设置无效

Invalid env setting in dockerfile

docker中的env设置不能在ENTRYPOINT中生效,但进入容器后可以正常使用

下面可以看到MYSQL_DB的环境变量设置

备注: 因为我想通过脚本动态设置ENV,所以在写Dockerfile的时候不知道有哪些环境变量,所以没办法在docker文件中使用ENV来设置环境变量。我只能用运行命令动态引入环境变量

Docker 文件:

FROM alpine:3.8
ENV ENV="/etc/profile" 
RUN echo "export MYSQL_DB=127.0.0.1" >> "$ENV"
RUN echo "env && echo '************' && tail -f /etc/profile">/tmp/test.sh

ENTRYPOINT  ["sh","tmp/test.sh"]

运行 Dockerfile

docker build -f Dockerfile -t test . && docker run --name test -p 3333:3000 -itd test && docker logs -f test

docker 日志

HOSTNAME=dcb1372343c0
SHLVL=1
HOME=/root
ENV=/etc/profile
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
************
export PAGER=less
export PS1='\h:\w$ '
umask 022

for script in /etc/profile.d/*.sh ; do
        if [ -r $script ] ; then
                . $script
        fi
done
export MYSQL_DB=127.0.0.1

exec docker 打印环境

➜  nodejs_dist git:(master) ✗ docker exec -it test /bin/sh                                                                                                    
dcb1372343c0:/# env
HOSTNAME=dcb1372343c0
SHLVL=1
HOME=/root
PAGER=less
PS1=\h:\w$ 
ENV=/etc/profile
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
CHARSET=UTF-8
MYSQL_DB=127.0.0.1

/etc/profile 仅在 login shell 内调用,而 sh 默认在 non login shell 模式下工作。

下一个解决方案可能是将其更改为强制使用逻辑 shell:

ENTRYPOINT  ["sh","-l","tmp/test.sh"]

执行结果:

$ docker run abc:1
HOSTNAME=11a873681051
SHLVL=1
HOME=/root
PAGER=less
PS1=\h:\w$
ENV=/etc/profile
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
CHARSET=UTF-8
MYSQL_DB=127.0.0.1
************
export PAGER=less
export PS1='\h:\w$ '
umask 022

for script in /etc/profile.d/*.sh ; do
        if [ -r $script ] ; then
                . $script
        fi
done
export MYSQL_DB=127.0.0.1