Docker入口脚本无法获得$ DB_PORT_3306_TCP_ADDR环境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容器提供的环境variables,例如提供到mariadb服务器的连接的DB_PORT_3306_TCP_ADDR。

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

 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^ 

我试图解决它,但我不明白为什么发生。

这不是你想做链接的方式。

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

使用docker-compose

如果你使用docker-compose,你可以命名你的数据库服务(比如db ),然后你的其他容器可以被告知连接到db ,就好像它是一个主机名。

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

使用dockernetworking

如果你喜欢不使用compose运行容器,只要确保它们在同一个networking上,就像这样:

 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^ 

如果所有的容器都在同一个networking上,那么和docker-compose一样,你可以告诉你的piwik容器使用“piwikdb”作为服务器(即你的另一个容器的容器名)。