首页 > 解决方案 > 如何在 docker 卷中运行任何命令?

问题描述

经过几天的测试并在 docker 上工作(我通常试图从 vagrant 迁移到 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

示例_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

示例_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 会说找不到根目录 file/directory = /var/www/dev 我猜它是因为它是一个卷,并且在容器完全启动之前它不会启动因为如果我在没有 prev 命令的情况下启动容器会导致错误,那么我可以登录到容器并从命令行执行命令而不会出现任何错误

如何解决这个问题?

标签: dockerdocker-compose

解决方案


在您的第一个 Dockerfile 中,使用COPY指令将您的应用程序复制到映像中,然后再执行RUN composer install. 它看起来像

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

(摘自php 图像文档;该图像可能没有预装作曲家)。

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

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


推荐阅读