You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

catalogue/docker/catalogue/Dockerfile
FROM golang:1.7

COPY . /go/src/github.com/microservices-demo/catalogue
WORKDIR /go/src/github.com/microservices-demo/catalogue

RUN go get -u github.com/FiloSottile/gvt
RUN gvt restore && \
    CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /app github.com/microservices-demo/catalogue/cmd/cataloguesvc

FROM alpine:3.4

ENV	SERVICE_USER=myuser \
	SERVICE_UID=10001 \
	SERVICE_GROUP=mygroup \
	SERVICE_GID=10001

RUN	addgroup -g ${SERVICE_GID} ${SERVICE_GROUP} && \
	adduser -g "${SERVICE_NAME} user" -D -H -G ${SERVICE_GROUP} -s /sbin/nologin -u ${SERVICE_UID} ${SERVICE_USER} && \
	apk add --update libcap

WORKDIR /
COPY --from=0 /app /app
COPY images/ /images/

RUN	chmod +x /app && \
	chown -R ${SERVICE_USER}:${SERVICE_GROUP} /app /images && \
	setcap 'cap_net_bind_service=+ep' /app

USER ${SERVICE_USER}

ARG BUILD_DATE
ARG BUILD_VERSION
ARG COMMIT

LABEL org.label-schema.vendor="Weaveworks" \
  org.label-schema.build-date="${BUILD_DATE}" \
  org.label-schema.version="${BUILD_VERSION}" \
  org.label-schema.name="Socks Shop: Catalogue" \
  org.label-schema.description="REST API for Catalogue service" \
  org.label-schema.url="https://github.com/microservices-demo/catalogue" \
  org.label-schema.vcs-url="github.com:microservices-demo/catalogue.git" \
  org.label-schema.vcs-ref="${COMMIT}" \
  org.label-schema.schema-version="1.0"

CMD ["/app", "-port=80"]
EXPOSE 80
catalogue/docker/catalogue-db/Dockerfile
FROM mysql:5.7

# ENV MYSQL_ROOT_PASSWORD DEFAULT_PASS
# ENV MYSQL_ALLOW_EMPTY_PASSWORD=true
# ENV MYSQL_DATABASE=socksdb

COPY ./data/dump.sql /docker-entrypoint-initdb.d/

다단계 빌드 사용

다단계 빌드 사용

다단계 빌드를 사용하면 FROMDockerfile에서 여러  을 사용할 수 있습니다 .  FROM명령어는 다른 기준을 사용할 수 있으며 각각의 명령어는 새로운 빌드 단계를 시작합니다. 한 스테이지에서 다른 스테이지로 아티팩트를 선택적으로 복사하여 최종 이미지에서 원하지 않는 것을 남겨 둘 수 있습니다. 이것이 어떻게 작동하는지 보여주기 위해 이전 섹션의 Dockerfile을 조정하여 다단계 빌드를 사용합시다.

Dockerfile:

FROM golang:1.7.3
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 GOOS=linux 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"]  

단일 Dockerfile 만 필요합니다. 별도의 빌드 스크립트가 필요하지 않습니다. Just Run: docker build.

$ docker build -t alexellis2/href-counter:latest .

최종 결과는 이전과 동일한 작은 제작 이미지이며, 복잡성이 현저히 줄어 듭니다. 중간 이미지를 작성할 필요가 없으며 로컬 시스템에 아티팩트를 전혀 추출 할 필요가 없습니다.

어떻게 작동합니까? 두 번째 FROM명령은 alpine:latest이미지를 기본으로 새 빌드 단계를 시작합니다 .

COPY --from=0선은 이전 단계의 제작 된 이슈만을이 새로운 단계로 복사합니다. 

Go SDK 및 중간 아티팩트는 남겨져 있으며 최종 이미지에 저장되지 않습니다.

catalogue/docker-compose.yml

version: '2'

services:
    catalogue:
        build:
            context: .
            dockerfile: ./docker/catalogue/Dockerfile
        image: weaveworksdemos/catalogue
        hostname: catalogue
        restart: always
        cap_drop:
            - all
        cap_add:
            - NET_BIND_SERVICE
        read_only: true
        environment:
            - reschedule=on-node-failure
        ports:
            - "8080:80"
    catalogue-db:
        build:
            context: ./docker/catalogue-db/
        image: weaveworksdemos/catalogue-db
        hostname: catalogue-db
        restart: always
        environment:
            - reschedule=on-node-failure
            - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
            - MYSQL_ALLOW_EMPTY_PASSWORD=true
            - MYSQL_DATABASE=socksdb

catalogue/docker-compose-zipkin.yml

version: '2'

services:
    catalogue:
        build:
            context: .
            dockerfile: ./docker/catalogue/Dockerfile
        image: weaveworksdemos/catalogue
        hostname: catalogue
        restart: always
        cap_drop:
            - all
        cap_add:
            - NET_BIND_SERVICE
        read_only: true
        environment:
            - ZIPKIN=http://zipkin:9411/api/v1/spans
            - reschedule=on-node-failure
        ports:
            - "8080:80"
    catalogue-db:
        build:
            context: ./docker/catalogue-db/
        image: weaveworksdemos/catalogue-db
        hostname: catalogue-db
        restart: always
        environment:
            - reschedule=on-node-failure
            - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
            - MYSQL_ALLOW_EMPTY_PASSWORD=true
            - MYSQL_DATABASE=socksdb
    zipkin:
        image: openzipkin/zipkin 
        hostname: zipkin
        restart: always
        cap_drop:
            - all
        cap_add:
            - CHOWN
            - SETGID
            - SETUID
        read_only: true
        tmpfs:
            - /tmp:rw,noexec,nosuid
        environment:
            - reschedule=on-node-failure
        ports:
            - "9411:9411"
    zipkinseed:
        image: alpine
        command: /bin/sh -c 'sleep 10 ; wget http://catalogue/health ; wget http://catalogue/catalogue ; wget http://catalogue/catalogue/size ; wget http://catalogue/tags'
  • No labels