Поэтому мой рекомендуемый подход - использовать два отдельных контейнера, один для API и другой для внешнего интерфейса.
#1 API
# Step 1 - build
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /build
COPY . . # copy everything from where the dockerfile is, to current workdir inside the container (sloppy but it works)
RUN dotnet publish -o out # compile the dll's and put them in an "out" directory
# Step 2 - runtime (compiled dll:s)
FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build /build/out . # copy your compiled dll's from your BUILD CONTAINER and place them inside your runtime container
EXPOSE 5000/tcp # this is only to document what port is in use
ENTRYPOINT [ "dotnet", "API.dll", "--urls", "http://*:5000"] # the name of your DLL to run
Одна вещь, которую я считаю полезной для«Отладка» сборок в Dockerfiles заключается в добавлении RUN ls -al
для вывода текущего каталога, чтобы вы могли видеть, где вы находитесь, какие файлы создаются. Не стесняйтесь добавлять их.
#2 Frontend - angular example, but is probably very simular to react
# build
FROM node:10.9.0-alpine as node
WORKDIR /app
COPY . .
# npm install
RUN npm i -g @angular/cli@8.3.2
RUN npm install
RUN ng build --prod
# runtime
FROM nginx:1.13.12-alpine
COPY --from=node /app/out /usr/share/nginx/html
# RUN rm -r /etc/nginx/conf.d/default.conf # replace with your own server config if you like
COPY --from=node /app/default.conf /etc/nginx/conf.d/
Хорошо, давайте представим, что вы уже создали свои док-контейнеры, интерфейс и API. Только для запуска одного контейнера используйте docker run <image name>
- но это не сопоставило порты с host machine
. Для этого добавьте аргументы для сопоставления портов - что-то вроде этого docker run -p 3999:5000 <image name>
. Чтобы убедиться, что он работает, откройте браузер и перейдите к localhost:3999/your/api/endpoint
.
Первый аргумент -p 3999:5000
сопоставляет порт хост-машины :3999
с портом изолированного контейнера :5000
, вы можете поменять его по желанию.
См. docker --help
для получения дополнительных опций.
Еще один полезный совет - ввести командную оболочку с хост-машины в работающий контейнер, для этого выполните docker exec -it <container_id> bash
или docker exec -it <container_id> sh
. Чтобы просмотреть список запущенных контейнеров, сделайте docker ps
или docker ps -a
.
Не стесняйтесь задавать вопросы, если вы хотите, чтобы я обновил этот пост. Ура!