经过几天的测试并在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
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
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命令的情况下启动容器,这会导致错误,那么我可以登录到容器并从命令行执行命令而不会出现任何错误
如何解决此问题?
答案 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中,诸如service
或systemctl
或initctl
之类的命令仅在Docker中不起作用,并且您不应该尝试使用它们。标准做法是,当容器通过默认的CMD
指令启动时,将服务器进程作为前台进程启动。不利的一面是,由于服务器要到docker run
时才能启动,因此此时您的卷将可用。我可能会RUN mkdir
在Dockerfile中只是为了确保它存在。
答案 1 :(得分:0)
问题似乎是执行顺序。在映像构建时,/ var / www / dev可用。当您从该映像启动容器时,/ var / www / dev容器将被本地装载覆盖。
如果您不需要主机访问,则可以简单地跳过多余的卷。 如果要在其他容器中使用它,则应使用符号链接。