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

时间:2018-07-25 10:10:50

标签: docker docker-compose

经过几天的测试并在docker上工作(我通常试图从无业游民迁移到docker),我遇到了一个巨大的问题,我不确定如何或在何处修复它。

docker-compose.yml

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

Dockerfile

example_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 

Dockerfile

example_2

....
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
....

现在找不到example_1 composer.json文件/目录 和example_2 apache会说找不到根目录 文件/目录= / var / www / dev 我猜是因为它的体积很大,直到容器完全用完为止,因为如果我在没有prev命令的情况下启动容器,这会导致错误,那么我可以登录到容器并从命令行执行命令而不会出现任何错误

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

在执行第COPY之类的操作之前,请使用RUN composer install指令将应用程序复制到映像中。看起来像

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

(从php image documentation抄录;该图像可能没有预装作曲家)。

在两个Dockerfile中,请记住,每个RUN命令都会创建一个新的空容器,运行其命令,并自行清理。这意味着RUN cd ...之类的命令无效,并且您无法在一个RUN命令中在后台启动服务,以后再使它可用。它将在Dockerfile移至下一行之前停止。

在第二个Dockerfile中,诸如servicesystemctlinitctl之类的命令仅在Docker中不起作用,并且您不应该尝试使用它们。标准做法是,当容器通过默认的CMD指令启动时,将服务器进程作为前台进程启动。不利的一面是,由于服务器要到docker run时才能启动,因此此时您的卷将可用。我可能会RUN mkdir在Dockerfile中只是为了确保它存在。

答案 1 :(得分:0)

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

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