Docker Compose ile Oluşturduğum Konteyneri Yerelimdeki Bir Klasöre Bağlayamıyorum

Nodejs ve express kullanarak basit bir uygulama çalıştırıyorum. Uygulamanın bir docker imajını oluşturmaya ve docker compose kullanarak imaj ile bir konteyner oluşturmaya çalışıyorum. Oluşan konteynerdeki çalışma alanındaki dosyaları (bu durumda index.js, package.json ve diğer dosyalar) docker-compose.yml dosyasının bulunduğu dizindeki ./test dizinine mount etmek istiyorum ancak hata alıyorum.

Burada şunu belirtmem lazım: express-app klasöründe image oluşturuyorum test-app klasöründe ise docker compose yaml dosyası oluşturuyorum. İkisi birbirinden bağımsız ortamlardalar.

index.js

// index.js

const express = require("express");
const app = express();
const port = 3000;

app.get("/", (req, res) => {
  res.send("Hello Docker Compose!");
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

package.json

{
  "name": "my-node-app",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "express": "^4.17.1"
  },
  "scripts": {
    "start": "node index.js"
  }
}

Dockerfile

FROM node:14

WORKDIR /app

COPY package.json /app
COPY index.js /app
RUN npm install

EXPOSE 3000

CMD ["npm", "start"]

“docker build -t express-app:latest .” Komutu ile uygulamayı build ediyorum.

Test-app isimli başka bir klasörde ise “docker compose up” komutu ile aşağıdaki docker-compose.yml dosyasını çalıştırıyorum

Konteyner içerisindeki workdir içerisindeki dosyalar ./test klasörüne gelmiyor ve aşağıdaki hatayı alıyorum.

Attaching to test-app-express-app-1
test-app-express-app-1  | npm ERR! code ENOENT
test-app-express-app-1  | npm ERR! syscall open
test-app-express-app-1  | npm ERR! path /app/package.json
test-app-express-app-1  | npm ERR! errno -2
test-app-express-app-1  | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
test-app-express-app-1  | npm ERR! enoent This is related to npm not being able to find a file.
test-app-express-app-1  | npm ERR! enoent
test-app-express-app-1  |
test-app-express-app-1  | npm ERR! A complete log of this run can be found in:
test-app-express-app-1  | npm ERR!     /root/.npm/_logs/2023-11-17T15_23_04_691Z-debug.log
test-app-express-app-1 exited with code 254

Yapmak istediğim çok basit bir şey, dockerfile ile bir image oluştur. ardından docker compose ile bu imge’ı kullan, kullanırken de bir volume oluştur onu da klasöre bağla ama olmuyor.

İmage oluşturmada bir problem yok bu arada. docker-compose.yml dosyasını böyle configure ettiğimde sorunsuz çalışıyor ama ben böyle yapmak istemiyorum.

version: '3'

services:
  express-app:
    container_name:test
    image: express-app:latest
    ports:
      - 3000:3000
    volumes:
      - test:/app
volumes:
   test:

Strapinin eski versiyonlarında istediğim kullanıma uygun bir örnek yml dosyası var. o yml dosyasını da paylaşıyorum aşağıda. Onda tam olarak istediğim şekilde çalışıyor.

version: '3'

services:
  strapi:
    container_name: strapi
    image: strapi/strapi
    environment:
      - NODE_ENV=production
      - DATABASE_CLIENT=postgres
      - DATABASE_HOST=db
      - DATABASE_PORT=5432
      - DATABASE_NAME=strapi
      - DATABASE_USERNAME=strapi
      - DATABASE_PASSWORD=strapi
    ports:
      - 1337:1337
    volumes:
      - ./app:/srv/app
    depends_on:
      - db
    command: 'strapi start'

  db:
    container_name: postgres
    image: postgres
    restart: always
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: strapi
      POSTGRES_PASSWORD: strapi
      POSTGRES_DB: strapi

Neyi yanlış yapıyorum? anlayamıyorum…