Поскольку у вас есть две отдельные программы, вы обычно запускаете их в двух контейнерах с двумя отдельными образами. В обоих случаях вы можете использовать базовый файл Dockerfile для соответствующих языков:
.
# pyfolder/Dockerfile
FROM python:3.6
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt .
COPY . .
EXPOSE 5000
CMD ["./app.py"]
# ./Dockerfile
FROM golang:1.16-alpine AS build
COPY go.mod go.sum .
RUN go mod download
COPY main.go .
RUN go build -o main main.go
FROM alpine
COPY --from=build /go/main /usr/bin/main
EXPOSE 8080
CMD ["main"]
Вы вообще не обсуждаете, почему у вас есть два контейнера или как они взаимодействуют. Вы часто захотите, чтобы контейнеры вообще не имели локального состояния, если они могут им управлять, и обменивались данными только через сетевые интерфейсы, такие как HTTP. Это означает, что вам понадобится какой-то способ настроить сетевой адрес, который одна служба использует для вызова другой, поскольку работа в локальной среде разработки будет отличаться от работы в контейнерах (по сравнению с развертыванием в облаке и работой в Kubernetes). vs....) Переменная окружения была бы типичным подходом; скажем, код Go должен вызывать код Python:
url := os.Getenv("PYAPP_URL")
if url == "" {
url = "http://localhost:8080"
}
resp, err := http.Get(url)
Обычным инструментом для одновременного запуска нескольких контейнеров является Docker Compose. Это не единственный инструмент, но он является стандартной частью экосистемы Docker и проще, чем многие альтернативы. Вы должны написать файл YAML с описанием двух контейнеров:
.
version: '3.8'
services:
pyapp:
build: ./pyfolder
server:
build: . # (the directory containing the Go code and its Dockerfile)
environment:
- PYAPP_URL=http://pyapp:5000
ports:
- '8080:8080'
depends_on:
- pyapp
Запуск docker-compose up --build
создаст два образа и запустит два контейнера.
Вам нужно установить golang в образ python или python в образ golang. Тем не менее, это большой антипаттерн. Рассмотрите возможность запуска каждого из них в своем собственном контейнере.