【问题标题】:Dockerfile VOLUME not visibile on hostDockerfile VOLUME 在主机上不可见
【发布时间】:2018-12-16 09:16:38
【问题描述】:

在 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 dockerfile docker-volume


    【解决方案1】:

    正在创建卷,它只是没有在 docker-compose.yml 文件所在的执行上下文中创建。 我假设您正在运行 ls -lah 命令并期望在您的 docker-compose.yml 文件所在的目录中创建一些内容。这就是为什么你说,“但这没有发生”

    Dockerfile 中的 VOLUME 命令是有限的。当您从 Dockerfile 构建映像时,主机是未知的。直到使用您构建的映像执行docker run 之后,Docker 主机才已知。

    因此,当在 Dockerfile 中使用 VOLUME 命令,然后将 docker run 与该映像一起使用时,将在 Docker 安装配置的位置创建卷。要确认确实已为您的容器创建了卷,请使用以下命令:

    docker inspect -f '{{ .Mounts }}' [container_name]

    为了更好地控制和指定在 Docker 主机上创建 VOLUME 的位置,您需要使用 -v 选项和 docker run 或在 docker-compose.yml 文件中进行配置,就像对 MySQL 所做的那样持久化容器。

    您可以从 Dockerfile 中删除 VOLUME /var/www/html,并且应该这样做。因为您的FROM wordpress 图像创建了 VOLUME,正如您已经知道的那样。

    【讨论】:

    • 好的,这是一个两步配置: 1. 在 Dockerfile 中定义 VOLUME。 2. 做映射。在这之后又弹出了一个问题,如果你还在想,你可以看这里stackoverflow.com/questions/53801577/…
    • 嗯,我认为这是一步。在 Dockerfile 或使用 docker run -v 或在 docker-compose.yml 中定义卷。您选择三个地方之一来表达它。我更喜欢你的 docker-compose.yml,因为你使用的是 docker-compose
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多