Как я могу решить ошибку «невозможно подготовить контекст: путь «Dockerfile.xxx» не найден»

Я делаю проект, в котором работает чат TCP, который должен контейнеризироваться и создаваться с помощью docker-compose. Все в порядке, пока не попытаюсь построить:

$docker build Dockerfile.server
[+] Building 0.0s (0/0)                                                          docker:default                                                                                                            ERROR: unable to prepare context: path "Dockerfile.server" not found

Моя файловая структура

.
└── projee docker-chatroom
    └── docker-compose.yml
    └── Dockerfile.server
    └── Dockerfile.client
    └── serveryt.py
    └── clientyt.py
    └── logs
        └── ...

серверyt.py:

import threading
import socket
import logging

# Logging ayarları
logging.basicConfig(filename='logs/server.log', level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

host = '127.0.0.1'  # Tüm IP adreslerinden bağlantı kabul edilecek
port = 33333

sv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sv.bind((host, port))
sv.listen()

cl = []
name = []


def broadcast(message):
    for client in cl:
        client.send(message)


def handle(cl):
    while True:
        try:
            message = cl.recv(1024)
            broadcast(message)

        except:
            index = cl.index(cl)
            cl.remove(cl)
            cl.close()
            nickname = name[index]
            broadcast(f'{nickname} left the chat.'.encode('ascii'))
            name.remove(nickname)
            logging.info(f'{nickname} left the chat.')
            break


def receive():
    while True:
        client, adrs = sv.accept()
        logging.info(f'Connected with {str(adrs)}')

        client.send('Name:'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        name.append(nickname)
        cl.append(client)

        logging.info(f"Name of the client is {nickname}.")
        broadcast(f"{nickname} connected to the chat.".encode('ascii'))
        client.send('Connected to the chat.'.encode('ascii'))

        thread = threading.Thread(target=handle, args=(client,))
        thread.start()


logging.info("Server is listening...")
receive()


clientyt.py

import socket
import threading
import os
import time

name = os.getenv("USERNAME")
if not name:
    raise ValueError("USERNAME environment variable not set")

cl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while True:
    try:
        cl.connect(('server', 33333))  # '127.0.0.1' yerine 'server' kullanıyoruz
        break
    except ConnectionRefusedError:
        print("Server henüz başlatılmadı, 5 saniye sonra tekrar denenecek...")
        time.sleep(5)

def recieve():
    while True:
        try:
            message = cl.recv(1024).decode('ascii')
            if message == 'Name:':
                cl.send(name.encode('ascii'))
            else:
                print(message)
        except:
            print("An error occurred")
            cl.close()
            break

def write():
    while True:
        message = f'{name}: {input("")}'
        cl.send(message.encode('ascii'))

rc_th = threading.Thread(target=recieve)
rc_th.start()

wr_th = threading.Thread(target=write)
wr_th.start()


Dockerfile.сервер:

# Dockerfile.serveryt
FROM python:3.9-slim

WORKDIR /app

COPY serveryt.py .

RUN pip install scikit-learn

CMD ["python", "serveryt.py"]


Dockerfile.клиент:

# Dockerfile.clientyt
FROM python:3.9-slim

WORKDIR /app

COPY clientyt.py .

CMD ["python", "clientyt.py"]


docker-compose.yml

version: '3.8'

services:
  server:
    build:
      context: .
      dockerfile: Dockerfile.serveryt
    ports:
      - "33333:33333"
    volumes:
      - ./logs:/app/logs
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    container_name: chatroom_server

  client:
    build:
      context: .
      dockerfile: Dockerfile.clientyt
    depends_on:
      - server
    environment:
      - USERNAME=YourName  # Enter nickname
    container_name: chatroom_client

В чем проблема ? Я все еще не понял. Я думал, что это может быть проблема с разрешениями, но у докера есть root-доступ.

Я попробовал решить проблему со старыми сообщениями о переполнении стека, но это не сработало.

При использовании автономного docker build его аргументом является имя каталога; вы имеете в виду docker build . -f Dockerfile.server или docker compose build server, чтобы использовать настройки из файла docker-compose.yml?

David Maze 03.07.2024 16:58

я попробовал сборку Docker Dockerfile.server

Muhammed Salih Arpacı 03.07.2024 22:11
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
2
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказано в документации по сборке Docker: если имя Dockerfile не Dockerfile, вам нужно использовать опцию -f.

Итак, вам следует использовать эту команду для сборки:

docker build -f Dockerfile.server .

docker build -f Dockerfile.client .

Также в вашем файле docker-compose.yml неверное имя файла dockerfile.

Также вы можете использовать команду docker compose up для сборки, создания и запуска контейнеров.

спасибо большое, братан, это сработало

Muhammed Salih Arpacı 03.07.2024 22:39

но как мне узнать, как называется мое изображение

Muhammed Salih Arpacı 03.07.2024 22:44

Другие вопросы по теме