在构建时将$ HOSTNAME传递给Docker容器

时间:2017-08-01 16:48:48

标签: php mongodb docker containers dockerfile

我已经看过几篇关于此的帖子,但他们没有回答“如何在构建时将主机的主机名传递给容器?”的问题。

我需要在构建时(在docker文件中)而不是在创建时传递主机名的原因是因为我使用的是docker swarm,如果我在创建服务时传递主机名,那么我只会得到一个每个容器的主机名:

$ docker service create -p <port>:<port> --hostname $HOSTNAME --replicas 4 <image>

通过在运行时传递主机名,无论该容器实际运行在哪个主机上,每个容器都会看起来好像它正在管理器节点上运行。

如何在docker文件中的docker构建过程中传递hostname值?

我需要能够在容器中查看主机名的原因是因为每次访问容器时我都想访问mongo数据库并增加容器和节点的视图计数以显示负载平衡群体的特征。

我需要在docker文件中添加什么内容?

Dockerfile:

FROM resin/raspberry-pi-alpine-node
MAINTAINER brennansaul jamessaul7629@gmail.com

RUN apk --update add nginx php5-fpm && \
    mkdir -p /run/nginx

ADD www /www
ADD nginx.conf /etc/nginx/
ADD php-fpm.conf /etc/php5/php-fpm.conf
ADD run.sh /run.sh

ENV LISTEN_PORT=80

EXPOSE 80
CMD /run.sh

的index.php

<html>
    <h1><?php echo "Hello ".($_ENV["NAME"]?$_ENV["NAME"]:"world")."!"; ?></h1>
    <?php if($_ENV["HOSTNAME"]) {?><h3>My hostname is <?php echo $_ENV["HOSTNAME"]; ?></h3><?php } ?>
    <?php if($_ENV["HOST_NAME"]) {?><h3>My hostname is <?php echo $_ENV["HOST_NAME"]; ?></h3><?php } ?>
 </html>

HOST_NAME是我分配主机名的变量,而HOSTNAME是容器ID。

2 个答案:

答案 0 :(得分:3)

在构建期间使用主机名是没有意义的,因为基本的想法是在中央服务器中构建,然后推送,然后从需要将图像作为容器运行的每个实例拉出来。

所以我建议--mount主机名文件:

docker service create \
  -p <port>:<port> \
  --replicas 4
  --mount type=bind,source=/etc/hostname,destination=/tmp/host-hostname,readonly=true \
  <image>

使用此PHP:

 <h3>My hostname is <?php echo file_get_contents("/tmp/host-hostname"); ?></h3>

答案 1 :(得分:0)

在这种情况下,您不必通过Docker传递服务器主机名,您可以使用$_SERVER['HTTP_HOST']gethostname()或其他常用技术来获取容器ID。