Dockerfile VOLUME 在主机上不可见
Dockerfile VOLUME not visibile on host
在 WordPress Dockerfile 中,有一个 VOLUME /var/www/html
语句。如果我理解正确,这意味着 WordPress 文件(在 /var/www/html 中)应该映射到我的主机上包含 docker-compose.yml 的目录,但这并没有发生。你知道为什么吗?
我创建了自己的 WordPress Dockerfile,它扩展了原始 WordPress Dockerfile,您会在第 44 行 (https://github.com/docker-library/wordpress/blob/b3739870faafe1886544ddda7d2f2a88882eeb31/php7.2/apache/Dockerfile).
中找到所说的 VOLUME /var/www/html
语句
我什至尝试在我的 Dockerfile 底部添加 VOLUME /var/www/html
语句,您可以在下面的 Dockerfile 中看到。我添加它以防万一,但我认为那里没有任何问题。
FROM wordpress:4.9.8-php7.2-apache
##########
# XDebug #
##########
# Install
RUN pecl install xdebug-2.6.1; \
docker-php-ext-enable xdebug
# Configure
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_host=docker.for.win.localhost" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini ##
###########
# PHPUnit #
###########
RUN apt-get update; \
apt-get install wget
RUN wget https://phar.phpunit.de/phpunit-7.4.phar; \
chmod +x phpunit-7.4.phar; \
mv phpunit-7.4.phar /usr/local/bin/phpunit
RUN phpunit --version
###################
# PHP Codesniffer #
###################
RUN curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar; \
mv phpcs.phar /usr/local/bin/phpcs; \
chmod +x /usr/local/bin/phpcs
############
# Composer #
############
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"; \
php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"; \
php composer-setup.php; \
php -r "unlink('composer-setup.php');"; \
mv composer.phar /usr/local/bin/composer
##################
# Install Nodejs #
##################
RUN apt-get install -y gnupg2; \
curl -sL https://deb.nodesource.com/setup_11.x | bash -; \
apt-get install -y nodejs
##################
# Install Grunt #
##################
RUN npm install -g grunt-cli
#####################
# BASH customization#
#####################
RUN echo "alias ll='ls --color=auto -lA'" >> ~/.bashrc
VOLUME /var/www/html
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./docker-mysql/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: progonkpa/wordpress:1.0
restart: always
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
restart: always
volumes:
db_data:
正在创建该卷,它只是没有在您 docker-compose.yml 文件所在的执行上下文中创建。 我假设您是 运行 ls -lah
命令并期望在您的 docker-compose.yml 文件所在的目录中创建一些东西。这就是为什么你说 "BUT this is not happening"
Docker文件中的 VOLUME 命令受到限制。当您从 Docker 文件构建映像时,主机未知。直到使用您构建的映像执行 docker run
后,Docker 主机才为人所知。
因此,当在 Docker 文件中使用 VOLUME 命令,然后对该图像使用 docker run
时,卷将在 Docker 安装配置的位置创建。要确认确实为您的容器创建了卷,请使用此命令:
docker inspect -f '{{ .Mounts }}' [container_name]
为了更好地控制和指定在 Docker 主机上创建 VOLUME 的位置,您需要将 -v
选项与 docker run
一起使用或在 docker-compose.yml 文件,就像正在为您的 MySQL 持久性容器所做的那样。
您可以从 Docker 文件中删除 VOLUME /var/www/html
,您应该这样做。因为您的 FROM
wordpress 图像创建了 VOLUME,正如您所知。
在 WordPress Dockerfile 中,有一个 VOLUME /var/www/html
语句。如果我理解正确,这意味着 WordPress 文件(在 /var/www/html 中)应该映射到我的主机上包含 docker-compose.yml 的目录,但这并没有发生。你知道为什么吗?
我创建了自己的 WordPress Dockerfile,它扩展了原始 WordPress Dockerfile,您会在第 44 行 (https://github.com/docker-library/wordpress/blob/b3739870faafe1886544ddda7d2f2a88882eeb31/php7.2/apache/Dockerfile).
中找到所说的VOLUME /var/www/html
语句
我什至尝试在我的 Dockerfile 底部添加 VOLUME /var/www/html
语句,您可以在下面的 Dockerfile 中看到。我添加它以防万一,但我认为那里没有任何问题。
FROM wordpress:4.9.8-php7.2-apache
##########
# XDebug #
##########
# Install
RUN pecl install xdebug-2.6.1; \
docker-php-ext-enable xdebug
# Configure
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
echo "xdebug.remote_host=docker.for.win.localhost" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini ##
###########
# PHPUnit #
###########
RUN apt-get update; \
apt-get install wget
RUN wget https://phar.phpunit.de/phpunit-7.4.phar; \
chmod +x phpunit-7.4.phar; \
mv phpunit-7.4.phar /usr/local/bin/phpunit
RUN phpunit --version
###################
# PHP Codesniffer #
###################
RUN curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar; \
mv phpcs.phar /usr/local/bin/phpcs; \
chmod +x /usr/local/bin/phpcs
############
# Composer #
############
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"; \
php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"; \
php composer-setup.php; \
php -r "unlink('composer-setup.php');"; \
mv composer.phar /usr/local/bin/composer
##################
# Install Nodejs #
##################
RUN apt-get install -y gnupg2; \
curl -sL https://deb.nodesource.com/setup_11.x | bash -; \
apt-get install -y nodejs
##################
# Install Grunt #
##################
RUN npm install -g grunt-cli
#####################
# BASH customization#
#####################
RUN echo "alias ll='ls --color=auto -lA'" >> ~/.bashrc
VOLUME /var/www/html
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./docker-mysql/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: progonkpa/wordpress:1.0
restart: always
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
restart: always
volumes:
db_data:
正在创建该卷,它只是没有在您 docker-compose.yml 文件所在的执行上下文中创建。 我假设您是 运行 ls -lah
命令并期望在您的 docker-compose.yml 文件所在的目录中创建一些东西。这就是为什么你说 "BUT this is not happening"
Docker文件中的 VOLUME 命令受到限制。当您从 Docker 文件构建映像时,主机未知。直到使用您构建的映像执行 docker run
后,Docker 主机才为人所知。
因此,当在 Docker 文件中使用 VOLUME 命令,然后对该图像使用 docker run
时,卷将在 Docker 安装配置的位置创建。要确认确实为您的容器创建了卷,请使用此命令:
docker inspect -f '{{ .Mounts }}' [container_name]
为了更好地控制和指定在 Docker 主机上创建 VOLUME 的位置,您需要将 -v
选项与 docker run
一起使用或在 docker-compose.yml 文件,就像正在为您的 MySQL 持久性容器所做的那样。
您可以从 Docker 文件中删除 VOLUME /var/www/html
,您应该这样做。因为您的 FROM
wordpress 图像创建了 VOLUME,正如您所知。