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

如何在docker卷中运行任何命令?,docker,docker-compose,Docker,Docker Compose,在对docker进行了几天的测试和工作后(我通常试图从流浪汉迁移到docker),我遇到了一个巨大的问题,我不知道如何或在哪里解决它 docker-compose.yml 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:

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

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


如何解决此问题?

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

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

在第一个Dockerfile中,在执行类似于
运行composer安装
的操作之前,使用
COPY
指令将应用程序复制到映像中。看起来像

FROM php:7.0-cli
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN composer install
(从中抄袭;该图像可能没有预装composer)

在这两个DockerFile中,请记住每个
RUN
命令都会创建一个新的空容器,运行其命令,并在其自身之后进行清理。这意味着像
RUN cd…
这样的命令没有任何效果,您不能在一个
RUN
命令中启动后台服务,以后再使用它;它将在Dockerfile移到下一行之前停止


在第二个Docker文件中,像
service
systemctl
initctl
这样的命令在Docker中不起作用,您不应该尝试使用它们。标准做法是,当容器通过默认的
CMD
指令启动时,将服务器进程作为前台进程启动。另一方面,由于服务器在docker运行之前不会启动,因此此时您的卷将可用。我可以
在Dockerfile中运行mkdir
,只是为了确保它存在。

关于RUN命令的精彩信息,但是复制文件和通过卷提供文件有什么区别?如果复制文件,它们在图像中,可以推送到注册表,操作说明在Dockerfile中,您可以提交给源代码管理。如果它们在一个卷中,那么序列的可复制性就差得多。是的,我想我没有写我的问题,我想问的是:不是从一个卷中提供文件,而这些文件实际上不在服务器上,但是(链接或隐藏)使生活更轻松?我的意思是关于编码,改变,等等,它让生活更艰难;我指的是自动化构建、可重复构建、部署到不同主机、源代码控制、可审核性、,等等。但是你可以在某处和其他地方找到许多使用绑定安装的主机目录作为应用程序代码的人的例子。这正是我写的
中的问题,因为它是一个卷,在容器完全装满之前它是不会被打开的
FROM php:7.0-cli
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN composer install