V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mrkon
V2EX  ›  Docker

关于 Docker 环境变量设置

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

    为了使得 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   ·   我们的愿景   ·   实用小工具   ·   941 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:19 · PVG 06:19 · LAX 15:19 · JFK 18:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.