我正在尝试使用docker和nginx运行静态网站。我在我的ubuntu机器上使用jwilder/nginx-proxy作为反向代理。但是调用https://www.example.com会返回502错误。 我认为正确设置端口是有问题的,但是我看不到我的错误。
这是我的Dockerfile ...
FROM nginx:alpine
COPY . /usr/share/nginx/html
EXPOSE 3499
...这就是我配置gitlab ci的方式:
build:
stage: build
image: docker:stable
script:
- docker build -t ${DOCKER_CONTAINER}:latest .
production:
stage: release
image: docker:stable
variables:
GIT_STRATEGY: none
script:
- docker run
--name ${DOCKER_CONTAINER}
--detach
--restart=always
-e VIRTUAL_HOST=www.example.com
-e LETSENCRYPT_HOST=www.example.com
-p 3499
${DOCKER_CONTAINER}:latest
environment:
name: production
url: https://www.example.com
答案 0 :(得分:5)
问题在于,假设仅使用EXPOSE 3499
即可更改nginx配置上的端口。 Nginx仍在容器内的端口80
上运行。
EXPOSE
表示您的意图是图像确实打算暴露3499
。但是内部的服务器需要进行配置,以确保其侦听的端口相同。
由于您使用的是docker nginx官方镜像,因此您可以在下面阅读其文档
https://hub.docker.com/_/nginx
在nginx配置中使用环境变量
开箱即用,nginx不支持大多数配置块中的环境变量。但是如果您需要在nginx启动之前动态生成nginx配置,可以使用envsubst作为解决方法。
以下是使用docker-compose.yml的示例:
web:
image: nginx
volumes:
- ./mysite.template:/etc/nginx/conf.d/mysite.template
ports:
- "8080:80"
environment:
- NGINX_HOST=foobar.com
- NGINX_PORT=80
command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
mysite.template
文件随后可能包含这样的变量引用:
listen ${NGINX_PORT};
因此,如您所见,您需要在图像中做一些工作,以确保您的nginx实际上在3499
上监听
更新:2019年7月23日
如果您不想使用环境变量执行此操作。然后您可以使用docker-compose
覆盖文件因此,您将保留一个本地文件default.conf
,在其中更改内容
server {
listen 3499;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
将此文件安装到您的docker-compose.yml
web:
image: nginx
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:3499"
这将确保文件正确。如果您不想在运行时覆盖,甚至可以将其复制到Dockerfile
答案 1 :(得分:0)
您需要添加
-e VIRTUAL_PORT=3499 to your gitlab configuration.
检查jwilder / nginx-proxy文档的Multiple Ports
部分。
https://hub.docker.com/r/jwilder/nginx-proxy