关于 Docker 环境变量设置

2019-10-31 16:29:48 +08:00
 Mrkon

为了使得 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" 

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

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

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

```
docker run busybox echo "shell"
```
Trim21
2019-10-31 17:32:37 +08:00
你要写个 entrypoint.sh 然后在里面用那行代码设置环境变量,不是用 docker 命令设置
Mrkon
2019-10-31 17:48:13 +08:00
@anubu 是的,直接指定宿主机 ip 是最简单的.但是我想探究一下宿主机发生改变的情况.同时 fix linux use host.docker.internal.为啥还没有 merge....
Mrkon
2019-10-31 17:50:56 +08:00
@joyme 明白了,thanks
Mrkon
2019-10-31 17:52:09 +08:00
@Trim21 相当于在 dockerfile 中添加 ENTRYPOINT ["./entrypoint.sh"] 吗?
Trim21
2019-10-31 17:53:42 +08:00
@Mrkon 对,而且脚本最后要再加一个 exec 命令来运行 cmd
anubu
2019-10-31 17:58:49 +08:00
@Mrkon 追求更通用的写法,就是像 @Trim21 说的那样写启动脚本。因为这个变量不是在 Dockerfile 或宿主中执行的命令获取的,而是要在容器创建后执行命令获取的。
Mrkon
2019-10-31 18:04:56 +08:00
@Trim21 加 exec 命令运行 cmd 是指? 我直接使用 export REDIS_HOST=redis 就可以了啊.
Mrkon
2019-10-31 18:07:07 +08:00
@anubu @Trim21 清楚了.这些命令应该放在生成容器后.哈哈,谢谢.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX