关于 Docker 环境变量设置 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mrkon
V2EX    Docker

关于 Docker 环境变量设置

  •  
  •   Mrkon 2019-10-31 16:29:48 +08:00 6250 次点击
    这是一个创建于 2240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了使得 docker 内部能访问到宿主机的 mysql,我采用了stackoverflow高赞的答案,但问题是我该如何导入如下环境变量呢?

    export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}') 

    经过验证,失败的方法:

    # 语法错误 ENV MYSQL_HOST=$(route -n | awk '/UG[ \t]/{print $2}') # export won't persist across images. RUN export REDIS_HOST=redis && echo "$REDIS_HOST" # 返回的是宿主机的 ip docker run -e REDIS_HOST=redis && echo "$REDIS_HOST" 

    请问有什么办法解决该问题吗?

    10 条回复    2019-10-31 18:07:07 +08:00
    anubu
        1
    anubu  
       2019-10-31 17:28:32 +08:00   1
    宿主机上的 mysql 只能监听 127.0.0.1 吗?如果不是,mysql 改为监听宿主机 ip,容器直接连接宿主机 ip 最简单。如果是,按照贴出的资料,容器直接使用主机网络的方式最简单;如果非要使用桥接网络,首先 mysql 要监听网桥上宿主端 ip,其次容器里访问这个 ip 来连接到 mysql,问题中提到的环境变量就是指定这个 ip。如果在固定的宿主机上启动容器,查看这个 ip 后手动配置即可,不需要环境变量。
    joyme
        2
    joyme  
       2019-10-31 17:30:13 +08:00   1
    容器内部不是可以访问宿主机的网络吗?为什么不能访问宿主机的 mysql 呢?

    你的返回宿主机 ip 是因为你没有在容器里面执行指令,不要用&&符号,类似于下面的语法

    ```
    docker run busybox echo "shell"
    ```
    Trim21
        3
    Trim21  
       2019-10-31 17:32:37 +08:00 via Android   1
    你要写个 entrypoint.sh 然后在里面用那行代码设置环境变量,不是用 docker 命令设置
    Mrkon
        4
    Mrkon  
    OP
       2019-10-31 17:48:13 +08:00
    @anubu 是的,直接指定宿主机 ip 是最简单的.但是我想探究一下宿主机发生改变的情况.同时 fix linux use host.docker.internal.为啥还没有 merge....
    Mrkon
        5
    Mrkon  
    OP
       2019-10-31 17:50:56 +08:00
    @joyme 明白了,thanks
    Mrkon
        6
    Mrkon  
    OP
       2019-10-31 17:52:09 +08:00
    @Trim21 相当于在 dockerfile 中添加 ENTRYPOINT ["./entrypoint.sh"] 吗?
    Trim21
        7
    Trim21  
       2019-10-31 17:53:42 +08:00 via Android
    @Mrkon 对,而且脚本最后要再加一个 exec 命令来运行 cmd
    anubu
        8
    anubu  
       2019-10-31 17:58:49 +08:00
    @Mrkon 追求更通用的写法,就是像 @Trim21 说的那样写启动脚本。因为这个变量不是在 Dockerfile 或宿主中执行的命令获取的,而是要在容器创建后执行命令获取的。
    Mrkon
        9
    Mrkon  
    OP
       2019-10-31 18:04:56 +08:00
    @Trim21 加 exec 命令运行 cmd 是指? 我直接使用 export REDIS_HOST=redis 就可以了啊.
    Mrkon
        10
    Mrkon  
    OP
       2019-10-31 18:07:07 +08:00
    @anubu @Trim21 清楚了.这些命令应该放在生成容器后.哈哈,谢谢.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4944 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 09:38 PVG 17:38 LAX 01:38 JFK 04:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86