我一直试图在容器中加入 healthcheck ,但是,无论我做什么,容器似乎都无法正常工作。确切地说,我具有以下结构:
特拉菲克的所有标签都包含在docker-compose.yml
文件中。
每当我尝试在Dockerfile
或docker-compose.yml
中添加运行状况检查时,都会构建应用程序并侦听端口443上的连接,但是,当我尝试从浏览器访问地址时,它总是显示404 error
( Traefik 无法代理容器时)。
这是简单的 service 配置:
frontend:
restart: always
build:
context: ./configuration/frontend
dockerfile: Dockerfile
environment:
- application_environment=development
- FRONTEND_DOMAIN=HOST_HERE
volumes:
- ./volumes/frontend:/app:rw
- ./volumes/backend/.env:/.env:ro
- ./volumes/backend/resources/lang:/backend-lang:rw
labels:
- traefik.enable=true
- traefik.frontend.rule=Host:HOST_HERE
- traefik.port=3000
- traefik.docker.network=traefik_proxy
- traefik.frontend.redirect.entryPoint=https
- traefik.frontend.passHostHeader=true
- traefik.frontend.headers.SSLRedirect=true
- traefik.frontend.headers.browserXSSFilter=true
- traefik.frontend.headers.contentTypeNosniff=true
- traefik.frontend.headers.customFrameOptionsValue=SAMEORIGIN
- traefik.frontend.headers.STSPreload=true
- traefik.frontend.headers.STSSeconds=31536000
healthcheck:
test: ["CMD", "cd /app && yarn healthcheck"]
interval: 10s
timeout: 5s
start_period: 60s
networks:
- traefik_proxy
这是 healthcheck.js 文件,可通过命令yarn healthcheck
访问该文件:
const http = require('https');
const options = {
host: process.env.FRONTEND_DOMAIN,
port: 443,
path: '/',
method: 'GET',
timeout: 2000
};
const healthCheck = http.request(options, (response) => {
console.log(`STATUS: ${response.statusCode}`);
if (response.statusCode === 200) {
process.exit(0);
}
else {
process.exit(1);
}
});
healthCheck.on('error', function (error) {
console.error('ERROR', error);
process.exit(1);
});
healthCheck.end();
当我启动没有 HEALTHCHECK 选项(Dockerfile或compose)的容器时,它工作得很好,显示了页面,并且当我手动执行yarn healthcheck
时,它表明一切很好(我的意思是在控制台中,STATUS: 200
)。但是,通过自动运行状况检查,Traefik将无法访问该容器。