Моя структура приложения выглядит следующим образом:
.
├── src
│ └── some go files
├── templates
├── static
|── images
|── js
└── styles
А вот и мой Dockerfile
:
FROM golang:1.18
WORKDIR /usr/src/app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
CMD ["go", "run", "src/cmd/main.go"]
А вот и мой docker-compose.yml
:
version: "3.8"
services:
pgsql:
image: postgres
ports:
- "5432:5432"
volumes:
- todo_pg_db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=todo
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
app:
build: .
ports:
- "8080"
restart: always
depends_on:
- pgsql
nginx:
image: nginx
restart: always
ports:
- 801:801
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
volumes:
todo_pg_db:
А вот и nginx.conf
:
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
server {
listen 801;
server_name 127.0.0.1;
charset utf-8;
keepalive_timeout 5;
location / {
# checks for static file, if not found proxy to app
try_files $uri @backend;
}
location @backend {
# client_max_body_size 10m;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app:8080;
}
}
}
Моя проблема в том, что nginx не может найти статические файлы. Вот несколько примеров журналов:
open() "/usr/src/app/static/styles/bootstrap.min.css" failed (2: No such file or directory)
Но есть такой каталог.
когда я запускаю свой док-контейнер, используя эту запятую: sudo docker exec -it todo_app_1 bash
.
Затем я просматриваю содержимое файла, и он отлично работает!!!
cat /usr/src/app/static/styles/bootstrap.min.css
# output: file content...
Я не знаю, что здесь не так. Что мне не хватает?
Спасибо за Ваш ответ. Как я могу синхронизировать их файлы? Можете ли вы дать мне ключевое слово, чтобы я мог найти его?
Вы можете смонтировать статические файлы как том в контейнере nginx в файле docker-compose.
@paltaa Я отправил ответ, можете ли вы проверить его, пожалуйста? Теперь nginx правильно обслуживает мои статические файлы.
файл выглядит хорошо!
Я исправил это с помощью volumes
:
nginx:
image: nginx
restart: always
ports:
- 801:801
volumes:
- ./static:/var/www
- ./nginx.conf:/etc/nginx/nginx.conf
и в nginx.conf
:
location /static {
alias /var/www;
}
nginx работает из другого образа, в него не будет включен источник вашего приложения Go. (Также не используйте аргументы имени файла для
go run
. Если вы хотите использоватьrun
и чтобы он правильно работал с модулями, используйтеgo run .
, но было бы лучше не перекомпилировать приложение каждый раз при запуске контейнера)