Multistage Builds

Hocam, selamlar, detaylı eğitiminiz için de teşekkürler.

2 sorum olacak. İlki Dockerfile multi-stage ile ilgili. Şöyle ki, aşağıdaki kod ile işlem gerçekleştirmekteyim.

FROM node:latest
WORKDIR /usr/src/app
COPY ./app/package*.json ./
COPY ./app .
RUN npm install
RUN apt-get update && apt-get install -y curl postgresql-client
EXPOSE 3000
ENTRYPOINT [ "npm" ]
CMD [ "start" ]

HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD curl -f http://localhost:3000/ || exit 1

Ancak, burada postgre indirme işlemini de multi-stage ile yapmak istiyorum. Çok özel bir nedeni yok, sadece eğitimde de belirttiğiniz gibi image’lar güvenlik düzenlemeleri vs. yapıldığı için bu şekilde bir yol izlemek istiyorum. Diğer yandan, init.sql adında tabloların ve içeriklerin olduğu bir sql dosyam var. Bunu normalde docker cp ile container içerisine kopyalayıp exec ile import ediyordum.

Kodu şu hale getirdiğimde, node ile uygulamayı çalıştırsam da postgre’i başlatamıyor ve hata alıyorum.

FROM node:latest
WORKDIR /usr/src/app
COPY ./app/package*.json ./
COPY ./app .
RUN npm install
EXPOSE 3000
ENTRYPOINT [ "npm" ]
CMD [ "start" ]
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD curl -f http://localhost:3000/ || exit 1

FROM postgres:latest
ADD ./pgdata/init.sql ./
EXPOSE 5432
CMD psql -U cksn -d newdbtable -f ./init.sql

Aldığım hata şöyle;

psql: error: could not connect to server: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

Bu aşamada nasıl bir yol izlememi önerirsiniz?

Merhaba,
Multi-stage build bunun için değildir. Multi-stage build sonunda 2 imajdan tek bir imaj yaratmaz. Multi stage build’i şöyle düşünün.
Stage 1: Ben burada x, y, z bir işlemler yapacağım. Bunun sonucunda bir dosya oluşturacağım.
Stage 2: Benim esas oluşturmak istediğim imaj bu ama bu imajı oluşturmak için 1. stage’de oluşturduğum dosyaya ihtiyacım var. Onu 1. stage’den buraya kopyalayayım.

Eğitimde verdiğim örneği düşünün. Java uygulamanızı birinci stage’de derliyorsunuz. O derlenmiş halini 2. stage’de kullanıyorsunuz. Multi stage build’in tek amacı budur. Sizin yapmak istediğiniz şey ise 2 tier bir uygulama oluşturmak. 1. imaj node 2. imaj postgresql. Siz 2 imaj oluşturacaksınız. Bunu multi stage build ile yapamazsınız.