2

我有一个要求,我必须在我的入口命令中读取 docker run 参数。

docker run -d -p 4058:4058 -p 5800-5805:5800-5805 image_name

Dockerfile:

FROM alpine

# some logic in here

CMD ["/bin/sh", "-c", "sh start.sh"]

在我的 start.sh 文件中,我想读取 docker run 的 -p 值(4058:4058 5800-5805:5800-5805)。

除了在 docker run 中使用环境变量外,还有什么方法可以读取 start.sh 文件中的 -p 参数。

4

2 回答 2

1

目前唯一的方法是安装/var/run/docker.sock在你的 docker aka dind中。

也许这有一天会实施,但问题是从 2014 年开始的 :)。这里

于 2019-10-11T10:21:32.970 回答
0

除非您 mount ,否则无法在容器本身内获取 Bind 端口/var/run/docker.sock。但是你不应该忽视风险的高度,这样做更好地与 ENV 一起使用。

docker 的所有者/var/run/docker.sock是运行容器的主机的根目录,默认组成员身份为 docker 组。这就是为什么在另一个容器中挂载var/run/docker.sock会为您提供 root 权限,因为现在您可以做任何具有 docker 组成员身份的 root 用户可以做的事情。

所以我会建议通过docker-security-best-practices

但是,如果你想去并且你应该意识到风险,那么你可以这样做来获取绑定端口。

docker run --rm -it --name test -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh -c "apk add --no-cache curl jq && sh"

然后运行

docker exec -it test ash 
curl -s --unix-socket /var/run/docker.sock  http:/v1.26/containers/$(hostname)/json | jq \'.NetworkSettings | .Ports | keys\' 
#output:
[
  "3000/tcp"
]

于 2019-10-11T10:55:51.687 回答