代码之家  ›  专栏  ›  技术社区  ›  Yamen Nassif

如何在docker卷中运行任何命令?

  •  0
  • Yamen Nassif  · 技术社区  · 6 年前

    在对docker进行了几天的测试和工作之后(我通常试图从流浪者迁移到docker),我遇到了一个巨大的问题,我不知道如何或者在哪里解决它。

    复方制剂

    version: "3"
    services:
      server:
        build: .
        volumes:
          - ./:/var/www/dev
        links:
          - database_dev
          - database_testing
          - database_dev_2
          - mail
          - redis
        ports:
          - "80:8080"
        tty: true
        #the rest are only images of database redis and mailhog with ports
    

    停靠文件

    示例1

    FROM ubuntu:latest
    LABEL Yamen Nassif
    SHELL ["/bin/bash", "-c"]
    RUN apt-get install vim mc net-tools iputils-ping zip curl git  -y
    RUN curl -sS https://getcomposer.org/installer |  php -- --install-dir=/usr/local/bin --filename=composer
    RUN cd /var/www/dev
    RUN composer install 
    

    停靠文件

    示例二

    ....
    RUN apt-get install apache2 openssl php7.2 php7.2-common libapache2-mod-php7.2 php7.2-fpm php7.2-mysql php7.2-curl php7.2-dom php7.2-zip php7.2-gd php7.2-json php7.2-opcache php7.2-xml php7.2-cli php7.2-intl php7.2-mbstring php7.2-redis -y
    
    # basically 2 files with just rooting to /var/www/dev
    COPY docker/config/vhosts /etc/apache2/sites-available/
    RUN service apache2 restart
    ....
    

    现在找不到示例_1 composer.json文件/目录 apache会说没有找到根目录 文件/目录=/var/www/dev 我想这是因为它是一个卷,在容器完全启动之前它不会启动,因为如果我在没有prev命令的情况下启动容器,这将导致一个错误,然后我可以登录到容器并从命令行执行命令,而不会出现任何错误

    怎么解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Maze    6 年前

    在第一个Dockerfile中,使用 COPY 指示在执行以下操作之前将应用程序复制到映像中 RUN composer install . 看起来像是

    FROM php:7.0-cli
    COPY . /usr/src/app
    WORKDIR /usr/src/app
    RUN composer install
    

    (从 php image documentation ;该映像可能未预先安装composer)。

    在两个dockerfile中,记住 RUN 命令创建一个新的空容器,运行其命令,并在其自身之后进行清理。这意味着命令 RUN cd ... 没有效果,并且不能在一个后台启动服务 跑步 命令并在稍后可用;在Dockerfile移到下一行之前,它将被停止。

    在第二个Dockerfile中,命令如下 service systemctl initctl 只是不要在Docker工作,你不应该尝试使用它们。标准做法是在容器通过默认方式启动时,将服务器进程作为前台进程启动 CMD 指令。另一方面,因为服务器要等到 docker run 时间到了,你的音量到时候就到了。我可以 RUN mkdir 在DoCKFr档中,以确保它存在。

        2
  •  0
  •   OkieOth    6 年前

    问题似乎是执行命令。在映像构建时/var/www/dev可用。从该映像启动容器时,容器/var/www/dev将被本地装载覆盖。

    如果您不需要从主机进行访问,则可以简单地跳过多余的卷。 如果要在其他容器中使用它,则应使用符号链接。