nginx에서 제공하는 NodeJS를 실행하려고합니다. NodeJS 서버에 프록시하고 이미지, CSS, js와 같은 정적 콘텐츠를 제공하고 싶습니다.
내 docker-compose 파일은 다음과 같습니다.
version: "3.7"
services:
web:
build: .
image: 127.0.0.1:5000/test
volumes:
- public:/app/public
deploy:
replicas: 2
nginx:
image: nginx:stable-alpine
ports:
- 80:80
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
# share files from web
- public:/static:ro
volumes:
public:
내 Dockerfile이 실행 npx webpack -p
되어 모든 정적 파일 ( /app/public
) 을 빌드 한 다음 node /app/src/server.min.js
. NodeJS는 최소한의 페이지 업데이트를 위해 ajax 엔드 포인트와 함께 서버 측 React를 제공합니다. 위에서 언급했듯이 nginx 컨테이너는 정적 콘텐츠 (css, js, 이미지 등)를 제공합니다.
문제는 정적 파일을 업데이트 할 수 없다는 것입니다. 볼륨이 생성되고 채워지면 해당 파일을 변경할 수 없습니다. 즉, CSS 또는 JS를 업데이트 할 수 없습니다.
이 동작은 docker-compose up 또는 docker stack deploy로 볼 수 있습니다.
볼륨을 다시 만들거나 컨테이너간에 다른 방식으로 파일을 제공 할 수있는 방법이 있습니까?
여기에서 취할 수있는 세 가지 기본 접근 방식이 있습니다.
첫 번째는 빌드시 Nginx 또는 다른 것이 호스팅 할 수있는 Docker 공간 외부 어딘가에 정적 자산을 복사하는 것입니다. 어쨌든 AWS에서 실행중인 경우 S3에서 직접 제공 할 수 있습니다. 로컬 환경에있는 경우 명명 된 볼륨 대신 호스트 경로를 사용하십시오. 이것은 대부분 "처음 사용할 때만"볼륨 동작을 피할 뿐이지 만 Docker 외부에서 약간의 작업이 필요합니다.
동일한 콘텐츠를 두 개의 이미지로 빌드하고 볼륨을 사용하여 공유하지 않을 수 있습니다. nginx 이미지에 대한 두 번째 Dockerfile을 추가해야하며 정적 콘텐츠를 빌드하기위한 일종의 빌드 파이프 라인 (Webpack?)이있는 경우 해당 파일이 미리 실행되도록해야합니다. 다음과 같은 Dockerfile 라인
COPY --from=127.0.0.1:5000/test /app/public /static
작동 할 수 있습니다.
web
Docker에 의존하는 대신 시작시 이미지가 자체 데이터를 수동으로 복사하도록 할 수도 있습니다. 다음과 같은 진입 점 스크립트를 가질 수 있습니다.
#!/bin/sh
if [ -d /static ]; then
cp -r /app/public/* /static
fi
exec "$@"
이미지에 추가하고 /static
두 컨테이너 에 공유 볼륨을 마운트하십시오 .
이러한 모든 경우는 Docker가 볼륨을 자동으로 채우는 동작을 방지합니다. 나는 일반적으로 정확히이 문제로 인해 그것을 피하려고 합니다. 컨테이너를 처음 실행할 때만 발생 하지만 실제로는 자주 업데이트, 재배포 등을 수행 하지만 해당 볼륨이 이미 존재하므로 Docker가 업데이트하지 않습니다. . (이 동작은 수정없이 표준 Docker 이미지를 실행할 수 있음에도 불구하고 Kubernetes에서 전혀 작동하지 않습니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다