【问题标题】:vendor folder disappears after dockerfile finish buildingdockerfile 完成构建后供应商文件夹消失
【发布时间】:2020-09-11 00:34:51
【问题描述】:

标题说明了一切。我的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 命令之后的每一步都使用 ssh,以查看供应商文件夹何时消失,但没有运气。它在 Dockerfile 构建过程中的任何时候都不会消失,这让我质疑我的 docker-compose.yml 文件,更具体地说是在 volumes 部分。我对 docker 很陌生,我可能误解了一些东西。

我想要什么

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

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

【问题讨论】:

  • 您应该能够删除所有volumes: 指令。这将使用RUN composer install 创建的vendor 目录和您COPY 中的其他源代码,而不是将这些隐藏在可能为空的主机目录后面。 Docker 镜像缓存可以帮助最小化重建时间,利用这一点主要需要先复制composer.json 文件(你有);你不需要卷。
  • 非常感谢!发送答案,我会接受并投票 :-)

标签: docker docker-compose swagger


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多