... lo que aporta los beneficios de las VM pero con mucha menos sobrecarga, más portabilidad y eficiencia
FROM golang:1.7.3
WORKDIR /go/src/mi-app/
COPY app.go .
RUN go get -d -v golang.org/x/net/html \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
docker build -t usuario/app:build .
docker create --name extract usuario/app:build
docker cp extract:/go/src/mi-app/app ./app
docker rm -f extract
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD ["./app"]
docker build --no-cache -t usuario/app:latest .
rm ./app
FROM golang:1.7.3
WORKDIR /go/src/mi-app/
COPY app.go .
RUN go get -d -v golang.org/x/net/html \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
Dockerfile
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD ["./app"]
#!/bin/sh
echo Building usuario/app:build
docker build -t usuario/app:build . -f Dockerfile.build
docker create --name extract usuario/app:build
docker cp extract:/go/src/mi-app/app ./app
docker rm -f extract
echo Building usuario/app:latest
docker build --no-cache -t usuario/app:latest .
rm ./app
FROM golang:1.7.3
WORKDIR /go/src/mi-app/
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/mi-app/app .
CMD ["./app"]
docker build --no-cache -t usuario/app:latest .
FROM golang:1.7.3 as builder
WORKDIR /go/src/mi-app/
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=builder /go/src/mi-app/app .
CMD ["./app"]
docker build --target builder -t usuario/app:latest .
Puede resultar útil para
Al generar una imagen, Docker crea una capa por cada instrucción que escribimos en nuestro Dockerfile.
Con el fin de minimizar el número de capas, concatenamos instrucciones usando && y otras técnicas.
Además, cuando creamos un contenedor, docker le asigna una "thin-layer", que no es más que una capa encima de todas las demás y que tiene la peculiaridad de ser de lectura-escritura.
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
La información que se escribe en la "thin-layer" de un contenedor se destruye con el propio contenedor.
¿Qué pasa si quiero que mis datos sean persistentes?
El resto de procesos no deberían modificar estos datos.
Otros procesos podrían modificar estos datos.
docker exec -it mi_app bash
app:
build: ./build/app/.
links:
- db:db
volumes:
- ./files/drupal:/var/www
- /etc/localtime:/etc/localtime:ro
- $HOME/.ssh/id_rsa:/root/.ssh/id_rsa # WARNING: only for dev
- $HOME/.ssh/id_rsa.pub:/root/.ssh/id_rsa.pub # WARNING: only for dev
- $HOME/.ssh/known_hosts:/root/.ssh/known_hosts # WARNING: only for dev
- ~/.gitconfig:/root/.gitconfig # WARNING: only for dev
ports:
- 80:80
mem_limit: 1024m
db:
image: mariadb:10.2
env_file:
- ./mysql.env
volumes:
- ./files/db:/var/lib/mysql
mem_limit: 748m
ports:
- "3306:3306"
Backup
image: mi/app:nuevaversion
docker-compose stop app
docker-compose rm -f app
docker-compose up -d app
docker-compose exec app sh /code/scripts/update.sh