供应商文件夹在 dockerfile 完成构建后消失



标题说明了一切。我的docker-compose.yml

swagger:
container_name: "swagger"
build:
context: web/
dockerfile: swagger/Dockerfile
dns:
- "8.8.8.8"
- "10.0.0.2"
volumes:
- ./web/swagger:/var/www/swagger:delegated
- ./web/api/controllers:/var/www/swagger/controllers:ro
- ./web/swagger/vendor:/var/www/swagger/vendor


我的Dockerfile

FROM php:zts-alpine3.11
RUN apk update && apk upgrade
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
WORKDIR /var/www/swagger
COPY swagger/composer.json ./
COPY swagger/composer.lock ./
RUN composer install --no-scripts --no-autoloader
COPY swagger .
COPY api/controllers controllers
EXPOSE 80
CMD php -S 0.0.0.0:80


构建:

Building swagger
Step 1/11 : FROM php:zts-alpine3.11
---> d9293b396dfe
Step 2/11 : RUN apk update && apk upgrade
---> Using cache
---> f3ea600aa726
Step 3/11 : RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
---> Using cache
---> 4fe1237c5dc2
Step 4/11 : WORKDIR /var/www/swagger
---> Using cache
---> c669a7b04c35
Step 5/11 : COPY swagger/composer.json ./
---> c5e6e3bbb97f
Step 6/11 : COPY swagger/composer.lock ./
---> 01e36ce086ae
Step 7/11 : RUN composer install --no-scripts --no-autoloader
---> Running in e08f6cf0fd92
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 6 installs, 0 updates, 0 removals
- Installing doctrine/lexer (1.2.0): Downloading (100%)         
- Installing symfony/polyfill-ctype (v1.17.0): Downloading (100%)         
- Installing symfony/yaml (v5.0.8): Downloading (100%)         
- Installing symfony/finder (v5.0.8): Downloading (100%)         
- Installing doctrine/annotations (1.10.2): Downloading (100%)         
- Installing zircote/swagger-php (3.0.4): Downloading (100%)         
symfony/yaml suggests installing symfony/console (For validating YAML files using the lint command)
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Removing intermediate container e08f6cf0fd92
---> db2db0c4240b
Step 8/11 : COPY swagger .
---> 04936a4370a0
Step 9/11 : COPY api/controllers controllers
---> d996bb813094
Step 10/11 : EXPOSE 80
---> Running in 82abb1153d51
Removing intermediate container 82abb1153d51
---> d2be0a04a504
Step 11/11 : CMD php -S 0.0.0.0:80
---> Running in 73e3d941ec27
Removing intermediate container 73e3d941ec27
---> 1a4ae5218579
Successfully built 1a4ae5218579
Successfully tagged apogo3_swagger:latest


如您所见,它构建良好,我什至尝试在RUN composer install --no-scripts --no-autoloader命令后进入每个步骤,以查看供应商文件夹何时消失,但没有运气。在 Dockerfile 构建过程中,它不会在任何时候消失,这让我质疑我的docker-compose.yml文件,更具体地说是在volumes部分。我对 docker 很陌生,我可能误解了一些东西。

我想要什么

。首先,能够构建它并在构建过程完成后保留供应商文件夹。其次,我希望生成的供应商文件夹保留在主机或容器中,以防止长时间构建。

我想我很接近,任何事情都非常感谢!

您可以从docker-compose.yml文件中删除所有volumes:

volumes:容器启动时是单向"推送":它们始终从主机目录或命名卷中获取内容,并用该目录替换映像中的数据。 (有一个特殊情况,当你第一次使用命名卷时,它会预加载来自映像的数据,但我不会依赖这个:Docker 永远不会更新卷内容,因为它可能包含用户数据,这在像 Kubernetes 这样的集群环境中不起作用。

在您的设置中,您将采用几个主机目录,并使用这些目录隐藏映像中的内容。 特别是,您正在从主机获取空vendor目录,并在映像中隐藏vendor目录。 (它不是命名卷,因此"首次使用时填充卷"规则不适用。

您需要的所有内容都已经在图像中的正确位置,因此您实际上根本不需要volumes:。 这也具有使映像完全独立的优点:如果需要在其他系统上运行它,则可以将其docker push到注册表,并从远程系统docker run它,而无需单独的应用程序代码副本。 (同样,这在像 Kubernetes 这样的集群环境中基本上是必需的。

相关内容

最新更新