Я делаю проект, в котором работает чат 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 Dockerfile.server
Как сказано в документации по сборке Docker: если имя Dockerfile не Dockerfile
, вам нужно использовать опцию -f
.
Итак, вам следует использовать эту команду для сборки:
docker build -f Dockerfile.server .
docker build -f Dockerfile.client .
Также в вашем файле docker-compose.yml
неверное имя файла dockerfile.
Также вы можете использовать команду docker compose up
для сборки, создания и запуска контейнеров.
спасибо большое, братан, это сработало
но как мне узнать, как называется мое изображение
При использовании автономного
docker build
его аргументом является имя каталога; вы имеете в видуdocker build . -f Dockerfile.server
илиdocker compose build server
, чтобы использовать настройки из файлаdocker-compose.yml
?