Docker link 容器 - 未显示环境变量

Docker link container - environment variables not being displayed

您好,我正在尝试 link 我的容器遵循本指南:

https://docs.docker.com/userguide/dockerlinks/

我运行docker run -d --name mongodb devops-mongodb

那我运行docker run -d -P --name rest-api --link mongodb devops-rest-api

到 link 我的 mongodb 容器到 rest-api 容器。

然后文档告诉我这样做是为了查看环境变量:

docker run --rm --name rest-api2 --link db:db devops-rest-api env

但是,它不会像文档中那样打印出环境变量。

我刚刚从我的 Spring 引导应用程序中获取 STDOUT。

我做错了什么?

您需要哪些环境变量?如果您不设置任何非将显示。如果您在此处 post 您的 dockerfile 将会有所帮助。我想你想要做的是从你的休息 api 访问 mongo,对吧?然后只需在您的 rest-api 配置中将 mongodb 定义为 mongo 的主机名,它应该可以工作。顺便说一句:在第二次调用中你有一个错误,因为你没有指定 mongodb 而是 --link db:db。 – hrrgttnchml 6 小时前

编辑 1:@hrrgttnchml,我期待这些环境变量,直接来自文档:

DB_PORT
DB_PORT_5432_TCP
DB_PORT_5432_TCP_PROTO
DB_PORT_5432_TCP_PORT
DB_PORT_5432_TCP_ADDR

我认为您不必使用 -e、-env 标志创建环境变量。 根据文档,当您 link 两个容器时,Docker 会自动创建它们:

Docker creates several environment variables when you link containers. Docker automatically creates environment variables in the target container based on the --link parameters. It will also expose all environment variables originating from Docker from the source container. These include variables from:

the ENV commands in the source container’s Dockerfile
the -e, --env and --env-file options on the docker run command when the source container is started

不过,我可能是错的。

这是我的休息-api dockerfile: http://pastebin.com/3Ktbbr9n

MongoDB 码头文件:http://pastebin.com/iqyKm5UK

两个应用程序都可以在容器为 运行 时启动。只是不知道如何 link 他们。

是的,我想让其余的-api与mongodb数据库通信。

因为我运行正在spring-引导其余的-api,我可以在我的application.properties文件中指定我的mongo数据库服务器如:

spring.data.mongodb.host=192.168.99.100
spring.data.mongodb.port=27017

所以你是要我替换 192.168.99.100 with mongodb

我也在 运行在 windows 上连接 oracle box 虚拟机,所以 VM 本身有一个 IP 地址,当连接到容器时,我必须使用机器的 IP 而不是localhost,所以这就是 192.168.99.100 的来源。正确吗?

编辑 2: 我已经得到其余的-api 来与 mongodb 进行通信而无需 容器 linking 只需使用 VM 的地址以及 Docker 文件中公开的端口。因此,对于 mongodb,它将是 192.168.99.100:27017,而对于其余的 api,它将是 192.168.99.100:8080。

但是,这是不切实际的,因为ip地址被硬编码到rest-api class本身。所以其他人将无法 运行 他机器上容器中的图像,因为 IP 地址不匹配。

现在显然解决方法是使用容器 linking 作为解决方案,因为主机和端口在 /etc/hosts 文件中更改时会自动更新,这使我们回到最初的问题如何让容器 linking 工作。

编辑 3:mongodb 指定为 rest-api 中的主机名确实有效,但仅当传入数据库的别名时link 例如:--link mongodb

devops-rest-api 有可能 ENTRYPOINT 吗? docker run 上的任何命令行参数都将传递到入口点。不要指定命令,而是尝试使用 --entrypoint env.

覆盖