Docker Entrypoint脚本无法获取$ DB_PORT_3306_TCP_ADDR环境变量

时间:2017-01-21 16:15:56

标签: docker environment-variables

我有以下Dockerfile:

FROM php:5.6-apache

MAINTAINER pc_magas@openmailbox.org
EXPOSE 80

RUN apt-get update && apt-get install -y \
      libjpeg-dev \
      libfreetype6-dev \
      libgeoip-dev \
      libpng12-dev \
      libldap2-dev \
      zip \
      mysql-client \
 && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr \
    && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \
    && docker-php-ext-install -j$(nproc) gd mbstring mysql pdo_mysql zip ldap opcache

RUN pecl install APCu geoip

ENV PIWIK_VERSION 3.0.1

RUN curl -fsSL -o piwik.tar.gz \
      "https://builds.piwik.org/piwik-${PIWIK_VERSION}.tar.gz" \
 && curl -fsSL -o piwik.tar.gz.asc \
      "https://builds.piwik.org/piwik-${PIWIK_VERSION}.tar.gz.asc" \
 && export GNUPGHOME="$(mktemp -d)" \
 && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 814E346FA01A20DBB04B6807B5DBD5925590A237 \
 && gpg --batch --verify piwik.tar.gz.asc piwik.tar.gz \
 && rm -r "$GNUPGHOME" piwik.tar.gz.asc \
 && tar -xzf piwik.tar.gz -C /usr/src/ \
 && rm piwik.tar.gz

COPY php.ini /usr/local/etc/php/php.ini

RUN curl -fsSL -o /usr/src/piwik/misc/GeoIPCity.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz \
 && gunzip /usr/src/piwik/misc/GeoIPCity.dat.gz

COPY docker-entrypoint.sh /entrypoint.sh

# WORKDIR is /var/www/html (inherited via "FROM php")
# "/entrypoint.sh" will populate it at container startup from /usr/src/piwik
VOLUME /var/www/html

ENV PIWIK_DB_HOST ""
ENV PIWIK_DB_PORT ""
ENV PIWIK_DB_USER ""
ENV PIWIK_DB_PASSWORD ""
ENV PIWIK_DB_NAME ""

#Create backup and restore foolders
RUN mkdir /var/backup && \
chmod 665 /var/backup && \
mkdir /var/restore && \
chmod 665 /var/restore

#Export Backup Folder
VOLUME /var/backup

#Export restore foolder
VOLUME /var/restore

COPY backup.php /tmp/backup.php

RUN cp /tmp/backup.php /usr/local/bin/piwik_backup && \
chown root:root /usr/local/bin/piwik_backup && \
chmod 733 /usr/local/bin/piwik_backup && \
rm -rf /tmp/backup

ENTRYPOINT ["/entrypoint.sh"]
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

使用以下脚本作为入口点:

#!/bin/bash

if [ ! -e piwik.php ]; then
  cp -R /usr/src/piwik/* /var/www/html
  chown -R www-data:www-data .
fi


: ${PIWIK_DB_HOST:=$DB_PORT_3306_TCP_ADDR}
echo "Mariadb Addr:"$DB_PORT_3306_TCP_ADDR
: ${PIWIK_DB_PORT:=${DB_PORT_3306_TCP_PORT}}
COUNTER=0
  echo "Waiting for mysql to start at ${PIWIK_DB_HOST} using port ${PIWIK_DB_PORT}..."
  while ! mysqladmin ping -h"$PIWIK_DB_HOST" -P $PIWIK_DB_PORT --silent; do
    if [ $COUNTER -gt 10 ] ; then
      exit 1
    fi
      echo "Connecting to ${PIWIK_DB_HOST} Failed"
      COUNTER=$[COUNTER+1]
      sleep 1
  done

  echo "Setting up the database connection info"
: ${PIWIK_DB_USER:=${DB_ENV_MYSQL_USER:-root}}
: ${PIWIK_DB_NAME:=${DB_ENV_MYSQL_DATABASE:-'piwik'}}

  if [ "$PIWIK_DB_USER" = 'root' ]; then
: ${PIWIK_DB_PASSWORD:=$DB_ENV_MYSQL_ROOT_PASSWORD}
  else
: ${PIWIK_DB_PASSWORD:=$DB_ENV_MYSQL_PASSWORD}
  fi

if ! mysql -h"$PIWIK_DB_HOST" -P $PIWIK_DB_PORT -u ${PIWIK_DB_USER} -p${PIWIK_DB_PASSWORD}  -e ";" ; then
  echo "The user does not exist to the mysql server: ${PIWIK_DB_HOST}"
  exit 1
fi

php console config:set --section="database" --key="host" --value=${PIWIK_DB_HOST}
php console config:set --section="database" --key="port" --value=${PIWIK_DB_PORT}
php console config:set --section="database" --key="username" --value=${PIWIK_DB_USER}
php console config:set --section="database" --key="password" --value=${PIWIK_DB_PASSWORD}
php console config:set --section="database" --key="tables_prefix" --value="piwik_"

php index.php

exec "$@"

但由于某种原因,入口点脚本无法找到mariadb容器提供的环境变量,例如DB_PORT_3306_TCP_ADDR提供与mariadb服务器的连接。

我使用以下命令将图像运行到容器容器中:

docker run --name piwikdb --volume $(pwd)/volumes/db:/var/lib/db \
    -e MYSQL_ROOT_PASSWORD=123 -d mariadb
docker run --volume $(pwd)/volumes/piwik:/var/www/data --link piwikdb:mysql \
    -p 8081:80 -t ^hash of the fresly build image^

我试图解决它,但我无法弄清楚为什么会发生这种情况。

1 个答案:

答案 0 :(得分:1)

这不是你想要做的链接。

正确的,支持的方式是以下之一。

使用docker-compose

如果您使用docker-compose,您可以命名数据库服务(例如,db),然后可以告诉您其他容器连接到db,就像它是主机名一样。 / p>

您可以在docker-compose.yml中使用env_file来指定包含数据库名称,mariadb端口,身份验证信息等参数的文件。每个容器都可以加载相同的env_file

使用泊坞网

如果您更喜欢在不使用compose的情况下运行容器,只需确保它们位于同一网络上,如下所示:

docker network create myapp
docker run --name piwikdb --volume $(pwd)/volumes/db:/var/lib/db \
    -e MYSQL_ROOT_PASSWORD=123 -d --network myapp mariadb
docker run --volume $(pwd)/volumes/piwik:/var/www/data \
    --network myapp -p 8081:80 -t ^hash of the fresly build image^

如果所有容器都在同一个网络上,那么与docker-compose一样,您可以告诉您的piwik容器使用" piwikdb"作为服务器(即您的其他容器的容器名称)。