问题描述
Docker环境变量问题,比如,在Docker Hub上下载了一个nginx镜像,现在要把我自己的配置文件用上去,看到说可以有三种方式: 1、用环境变量传递配置。 2、用数据卷,把配置文件放到数据卷中。 3、修改镜像,保存为新的镜像。
现在,我想采用第1种方法,文档中关于环境变量的内容如下:
可是怎么配置,仍然有点不清楚。
问题解答
回答1:谁告诉你环境变量可以用于传输配置文件了…可以用环境变量的意思是,有些软件既能识别环境变量中提供的配置,又能识别文件形式的配置,不过,很不幸,Nginx不在此列。
以wget为例,当设定HTTP代理时,可以选用以下任一方式:
在配置文件中加一行http_proxy = http://example.com/xxx
将系统环境变量$http_proxy设定为http://example.com/xxx
两种方法的作用是相同的。
当然,你可以在Docker容器里写一个Shell脚本,根据环境变量来修改配置文件的内容,但这就是另一个话题了。Github上有不少实现类似功能的工具,如Tiller。
补充一个资料:How Should I Get Application Configuration into my Docker Containers?
回答2:哦,在启动容器的时候要带参数,比如:./docker run --detach --name wordpress --net wordnet --publish 80:80 --env WORDPRESS_DB_HOST=mysql --env WORDPRESS_DB_PASSWORD=xxxxxxxx wordpress:4.4
当然在容器启动命令里要处理带进来的参数:
cat /entrypoint.sh
#!/bin/bashset -eif [[ '$1' == apache2* ]] || [ '$1' == php-fpm ]; then if [ -n '$MYSQL_PORT_3306_TCP' ]; thenif [ -z '$WORDPRESS_DB_HOST' ]; then WORDPRESS_DB_HOST=’mysql’else echo >&2 ’warning: both WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP found’ echo >&2 ' Connecting to WORDPRESS_DB_HOST ($WORDPRESS_DB_HOST)' echo >&2 ’ instead of the linked mysql container’fi fi if [ -z '$WORDPRESS_DB_HOST' ]; thenecho >&2 ’error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables’echo >&2 ’ Did you forget to --link some_mysql_container:mysql or set an external db’echo >&2 ’ with -e WORDPRESS_DB_HOST=hostname:port?’exit 1 fi # if we’re linked to MySQL and thus have credentials already, let’s use them : ${WORDPRESS_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}} if [ '$WORDPRESS_DB_USER' = ’root’ ]; then: ${WORDPRESS_DB_PASSWORD:=$MYSQL_ENV_MYSQL_ROOT_PASSWORD} fi : ${WORDPRESS_DB_PASSWORD:=$MYSQL_ENV_MYSQL_PASSWORD} : ${WORDPRESS_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-wordpress}} if [ -z '$WORDPRESS_DB_PASSWORD' ]; thenecho >&2 ’error: missing required WORDPRESS_DB_PASSWORD environment variable’echo >&2 ’ Did you forget to -e WORDPRESS_DB_PASSWORD=... ?’echo >&2echo >&2 ’ (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.)’exit 1 fi if ! [ -e index.php -a -e wp-includes/version.php ]; thenecho >&2 'WordPress not found in $(pwd) - copying now...'if [ '$(ls -A)' ]; then echo >&2 'WARNING: $(pwd) is not empty - press Ctrl+C now if this is an error!' ( set -x; ls -A; sleep 10 )fitar cf - --one-file-system -C /usr/src/wordpress . | tar xf -echo >&2 'Complete! WordPress has been successfully copied to $(pwd)'if [ ! -e .htaccess ]; then # NOTE: The 'Indexes' option is disabled in the php:apache base image cat > .htaccess <<-’EOF’# BEGIN WordPress<IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /index.php [L]</IfModule># END WordPress EOF chown www-data:www-data .htaccessfi fi # TODO handle WordPress upgrades magically in the same way, but only if wp-includes/version.php’s $wp_version is less than /usr/src/wordpress/wp-includes/version.php’s $wp_version # version 4.4.1 decided to switch to windows line endings, that breaks our seds and awks # https://github.com/docker-library/wordpress/issues/116 # https://github.com/WordPress/WordPress/commit/1acedc542fba2482bab88ec70d4bea4b997a92e4 sed -ri ’s/rn|r/n/g’ wp-config* if [ ! -e wp-config.php ]; thenawk ’/^/*.*stop editing.**/$/ && c == 0 { c = 1; system('cat') } { print }’ wp-config-sample.php > wp-config.php <<’EOPHP’// If we’re behind a proxy server and using HTTPS, we need to alert Wordpress of that fact// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxyif (isset($_SERVER[’HTTP_X_FORWARDED_PROTO’]) && $_SERVER[’HTTP_X_FORWARDED_PROTO’] === ’https’) { $_SERVER[’HTTPS’] = ’on’;}EOPHPchown www-data:www-data wp-config.php fi # see http://stackoverflow.com/a/2705678/433558 sed_escape_lhs() {echo '$@' | sed ’s/[]/$*.^|[]/&/g’ } sed_escape_rhs() {echo '$@' | sed ’s/[/&]/&/g’ } php_escape() {php -r ’var_export((’$2’) $argv[1]);’ '$1' } set_config() {key='$1'value='$2'var_type='${3:-string}'start='([’'])$(sed_escape_lhs '$key')2s*,'end=');'if [ '${key:0:1}' = ’$’ ]; then start='^(s*)$(sed_escape_lhs '$key')s*=' end=';'fised -ri 's/($starts*).*($end)$/1$(sed_escape_rhs '$(php_escape '$value' '$var_type')')3/' wp-config.php } set_config ’DB_HOST’ '$WORDPRESS_DB_HOST' set_config ’DB_USER’ '$WORDPRESS_DB_USER' set_config ’DB_PASSWORD’ '$WORDPRESS_DB_PASSWORD' set_config ’DB_NAME’ '$WORDPRESS_DB_NAME' # allow any of these 'Authentication Unique Keys and Salts.' to be specified via # environment variables with a 'WORDPRESS_' prefix (ie, 'WORDPRESS_AUTH_KEY') UNIQUES=(AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALT ) for unique in '${UNIQUES[@]}'; doeval unique_value=$WORDPRESS_$uniqueif [ '$unique_value' ]; then set_config '$unique' '$unique_value'else # if not specified, let’s generate a random value current_set='$(sed -rn 's/define((([’'])$unique2s*,s*)([’'])(.*)3);/4/p' wp-config.php)' if [ '$current_set' = ’put your unique phrase here’ ]; thenset_config '$unique' '$(head -c1M /dev/urandom | sha1sum | cut -d’ ’ -f1)' fifi done if [ '$WORDPRESS_TABLE_PREFIX' ]; thenset_config ’$table_prefix’ '$WORDPRESS_TABLE_PREFIX' fi if [ '$WORDPRESS_DEBUG' ]; thenset_config ’WP_DEBUG’ 1 boolean fi TERM=dumb php -- '$WORDPRESS_DB_HOST' '$WORDPRESS_DB_USER' '$WORDPRESS_DB_PASSWORD' '$WORDPRESS_DB_NAME' <<’EOPHP’<?php// database might not exist, so let’s try creating it (just to be safe)$stderr = fopen(’php://stderr’, ’w’);list($host, $port) = explode(’:’, $argv[1], 2);$maxTries = 10;do { $mysql = new mysqli($host, $argv[2], $argv[3], ’’, (int)$port); if ($mysql->connect_error) {fwrite($stderr, 'n' . ’MySQL Connection Error: (’ . $mysql->connect_errno . ’) ’ . $mysql->connect_error . 'n');--$maxTries;if ($maxTries <= 0) { exit(1);}sleep(3); }} while ($mysql->connect_error);if (!$mysql->query(’CREATE DATABASE IF NOT EXISTS `’ . $mysql->real_escape_string($argv[4]) . ’`’)) { fwrite($stderr, 'n' . ’MySQL 'CREATE DATABASE' Error: ’ . $mysql->error . 'n'); $mysql->close(); exit(1);}$mysql->close();EOPHPfiexec '$@'