我正在尝试创建一个多阶段构建,其中第一阶段为主题安装纱线,第二阶段为 Drupal 设置 PHP 环境。
当我查看输出时,看起来 yarn install 正在运行,但COPY底部附近的命令没有将其复制到 PHP 映像。如果我是对的,那么应该在我的本地机器上创建 node_modules 目录吗?
docker-compose.yml:
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"
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM node:latest as yarn-install
WORKDIR /app
COPY ./web/themes/material_admin_mine ./
RUN yarn install --verbose --force;
# from https://www.drupal.org/docs/8/system-requirements/drupal-8-php-requirements
FROM php:7.2-apache
# Install & setup Xdebug
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name …Run Code Online (Sandbox Code Playgroud) 我需要有两个接入npm和pipenv在同一容器中。我认为实现这一目标的最佳方法是多阶段构建。
如果我做这样的事情:
FROM python:3.7
COPY Pipfile /app/Pipfile
RUN pip install pipenv
FROM node:8
npm install
Run Code Online (Sandbox Code Playgroud)
如何确保pipenv二进制文件不会被丢弃?我需要从前一阶段复制哪些文件才能在最终图像中使用 pipenv?
I want to dockerize flask application which has lots of dependencies. My goal is to reduce the size of the final docker image.
I tried multi-stage build but it is not reducing the size of final docker image.
Below is my Dockerfile
FROM python:3.6-slim-buster as base
RUN apt-get update && apt-get install --no-install-recommends --no-upgrade -y \
libglib2.0-0 libxext6 libsm6 libxrender1 libfontconfig1 && rm -rf /var/lib/apt/lists/*
WORKDIR /wheels
COPY requirements.txt /wheels
RUN pip install -U pip \
&& pip wheel -r …Run Code Online (Sandbox Code Playgroud) Dockerfile:
FROM maven:3.6.3-openjdk-8 as builder
# Set the working directory.
WORKDIR /usr/src/mymaven
COPY ./ /usr/src/mymaven
CMD [ "mvn" , "clean" , "install" ]
FROM openjdk:8
COPY --from=builder /usr/src/mymaven/target /usr/src/myapp
WORKDIR /usr/src/myapp
CMD ["java", "-jar" , "Backend-0.0.1-SNAPSHOT.jar"]
Run Code Online (Sandbox Code Playgroud)
上面的 docker build 失败并显示错误:目标文件夹不存在
下面的 dockerfile 完美运行:
FROM maven:3.6.3-openjdk-8 as builder
# Set the working directory.
WORKDIR /usr/src/mymaven
COPY ./ /usr/src/mymaven
RUN [ "mvn" , "clean" , "install" ]
FROM openjdk:8
COPY --from=builder /usr/src/mymaven/target /usr/src/myapp
WORKDIR /usr/src/myapp
CMD ["java", "-jar" , "Backend-0.0.1-SNAPSHOT.jar"]
Run Code Online (Sandbox Code Playgroud)
只需将 CMD …
我从 Docker 那里得到了一些奇怪的行为,我找不到任何地方提到它。它似乎是随机跳过阶段,即使是我简单地从网上论坛复制粘贴的多阶段 Dockerfile。
我的 dockerfile 是:
FROM alpine as base
RUN echo "1"
# SKIPPED
FROM base as mid
RUN echo "2"
FROM base as final
RUN echo "3"
Run Code Online (Sandbox Code Playgroud)
输出:
docker build -t test .\ --no-cache
[+] Building 2.0s (7/7) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 143B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 1.3s
=> CACHED [base 1/2] FROM docker.io/library/alpine@sha256:... …Run Code Online (Sandbox Code Playgroud) 是否可以将多阶段 Dockerfile 的一个阶段复制到另一个阶段?
出于各种商业原因,我被指示使用多阶段 Dockerfile,但我真正需要做的是将应用程序服务器映像和网络服务器映像结合起来。这在 docker-compose 中很好,因为您可以参考每个部分 - 但我不确定这是否可以通过 GCP 和 Kubernetes 完成。
我的 Dockerfile 代码如下。
FROM php:7.1-fpm as appserver
RUN apt-get update && apt-get install -y libpq-dev \
&& docker-php-ext-install pdo pdo_pgsql pgsql
RUN apt-get update && \
apt-get install -y \
zlib1g-dev \
&& docker-php-ext-install zip
COPY ./app /var/www/html
FROM nginx:stable-alpine as webserver
COPY ./app /var/www/html/
COPY vhost-prod.conf /etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 docker 多阶段构建过程中使用 ARGS。
我的 Dockerfile 如下所示:
ARG DOCKER_REGISTRY=example.com/docker
FROM $DOCKER_REGISTRY/openjdk8:latest AS installer
ARG APP_VERSION=6.3.0.78
ARG DOCKER_REGISTRY
ARG REPO_TYPE=snapshot
ARG DB_VERSION=12.2.0.11-ee
ARG DB_TYPE=oracle ARG PASSWORD
ARG DOCKER_REGISTRY
ARG DB_VERSION
ARG DB_TYPE
FROM ${DOCKER_REGISTRY}/${DB_TYPE}/database:${DB_VERSION}
ARG DB_VERSION
ARG DB_TYPE
ARG PASSWORD
RUN mkdir -p /opt/oracle/script
COPY --from=installer /opt/installer/target_script/* /opt/oracle/scripts/
Run Code Online (Sandbox Code Playgroud)
每当它获取 docker 文件中的第二个 FROM 步骤时,它就会失败并出现错误invalid reference format,因为它无法识别获取图像的语法。
我的假设是它不知道如何处理ARG多阶段 docker 构建。