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
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