我想创建一个包含2个阶段的dockerfile。第一阶段是设置MySQL服务器,第二阶段是启动访问该服务器的后端服务。问题是后端服务在没有MySQL服务器可用时停止。是否有办法使阶段依赖于第一阶段的开始?有点奇怪的是,当我在顶部创建数据库的dockerfile时,显示的是后端日志。如果后端位于顶部,启动时显示MySQL的日志。
实际Dockerfile:
FROM mysql:latest AS BackendDatabase
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE="DienstplanverwaltungDatabase"
ARG MYSQL_USER="user"
ARG MYSQL_PASSWORD="password"
ARG MYSQL_ROOT_PASSWORD="password"
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
EXPOSE 3306
FROM openjdk:10-jre-slim AS Backend
LABEL description="Backend Dienstplanverwaltung"
LABEL maintainer="Martin"
COPY ./SpringDienstplanverwaltung/build/libs/dienstplanverwaltung-0.0.1-SNAPSHOT.jar /usr/local/app.jar
EXPOSE 8080
ENTRYPOINT java -jar /usr/local/app.jar
实际上你需要两个容器的Docker-composer。一个用于Mysql,一个用于java应用。Multistage主要用于#1这样的情况,例如java或Go。#2创建第二个映像并复制构建结果。总的想法是保持第二阶段的清洁。我们不需要构建工具,只需要第二阶段的结果。请参见示例:
FROM
Learn more about the "FROM" Dockerfile command.
golang:1.16
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app ./
CMD ["./app"]
好吧,你似乎对这里的各种事情有点困惑。首先,多阶段构建是为了构建一个需要某种构建/编译过程的应用程序,将该构建复制到另一个依赖较少且只有可执行文件的容器中,所以在这种情况下,试图在多阶段构建中运行数据库根本没有意义,因为构建容器并不运行它。
现在,你想有一个多阶段来构建java应用程序,然后将构建复制到另一个容器中,然后运行它。另外,当你运行这个容器时,你需要一个mysql数据库,使用docker-compose是一个很好的工具,就像这个例子:
version: '3.8'
services:
db:
image: mysql:8.0
cap_add:
- SYS_NICE
restart: always
environment:
- MYSQL_DATABASE=mydatabase
- MYSQL_ROOT_PASSWORD=mypassword
ports:
- '3306:3306'
volumes:
- db:/var/lib/mysql
# - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
api:
container_name: your-backend
build:
context: .
image: your-backend
depends_on:
- db
ports:
- 8080:8080
environment:
ENV_VAR_EXAMPLE: example
links:
- db
volumes:
db:
driver: local
还有一个用于java应用程序的多级Dockerfile示例:
# First stage: complete build environment
FROM maven:3.5.0-jdk-8-alpine AS builder
# add pom.xml and source code
ADD ./pom.xml pom.xml
ADD ./src src/
# package jar
RUN mvn clean package
# Second stage: minimal runtime environment
From openjdk:8-jre-alpine
# copy jar from the first stage
COPY --from=builder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar
EXPOSE 8080
CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]