Docker多阶段构建不能在阶段之间复制

时间:2019-01-02 05:45:56

标签: docker docker-compose dockerfile docker-multi-stage-build

我正在尝试创建一个多阶段构建,其中第一阶段为主题安装纱线,第二阶段为Drupal设置PHP环境。

当我查看输出时,看起来好像正在运行yarn install,但是底部附近的String[] columnNames = finalBcDF.columns(); Dataset<Row> x = null; for(String columnName : columnNames) { x = finalBcDF.withColumnRenamed(columnName, columnName.toUpperCase()); } 命令不会将其复制到PHP映像中。如果我认为正确,那么应该在本地计算机上创建node_modules目录吗?

docker-compose.yml:

COPY

Dockerfile:

version: '3.7'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/var/www/html:cached
    env_file:
      - ./local-development.env
    ports:
      - "8888:80"
  db:
    image: mysql:5.7
    env_file:
      - ./local-development.env
    ports:
      - "3306:3306"

1 个答案:

答案 0 :(得分:1)

当您的Dockerfile结尾时:

WORKDIR /var/www/html
COPY --from=0 /app ./web/themes/material_admin_mine

实际上,这应该将数据从第一个构建阶段复制到最终映像。但是,当您使用

启动容器时
volumes:
  - ./:/var/www/html:cached

/var/www/html目录树中的所有内容(包括最后的COPY步骤)都被隐藏,并替换为主机当前目录中的内容。如果您将其视为副本,则它是容器中的单向副本。以后的更改将被复制回主机,但是在启动时,没有什么可以将映像中的内容与您先前在目录中的内容进行同步。

Dockerfile本质上不会影响主机文件系统的内容。就您而言,听起来主机内容是您的应用程序的第二要件。鉴于进入第一阶段的过程,我只需在主机上运行yarn install步骤并完成它(您可能已经可以使用Node和Yarn了)。否则,您将需要一个更具选择性的volumes:部分,该部分会仔细尝试避免覆盖该目录。您也许可以挂载./web/src:/var/www/html/web/src之类的内容,仅包括应用程序代码,而避免隐藏.../web/themes树。