我有用于网络的Docker映像和用于服务器的另一个映像。
我的服务器使用特定的端口,我在服务器和Web中对其进行了硬编码。我还在docker-compose
文件中定义了此端口。
我认为正确的方法是仅在docker-compose.yml
中指定端口,然后以某种方式在服务器和Web的代码中使用此端口,而不是在三个不同的地方对该端口进行硬编码。
我应该在docker-compose.yml
中使用环境变量吗?最好的解决方案是什么?
答案 0 :(得分:0)
Docker Compose支持Env files,它允许您声明所有环境变量。然后,您可以替换端口号using one of the env variables。
env文件通常是一个好习惯,因为在切换到另一个环境(例如开发与生产)时,可以很容易地将其换出,和您可以通过以下方式即时设置值命令行,紧接在运行代码之前。
对于许多支持读取这些文件的编程语言,都有不错的库,例如Dotenv for Node.js。
答案 1 :(得分:0)
根据我的经验,最好让服务器选择自己的“正常”端口并在Docker领域中出现的地方进行硬编码。
假设我有一个服务器进程,也许是我用Go编写的,我决定它要在端口12345上监听。然后:
通常的Go约定是服务器采用可选的命令行参数,例如-bind 0.0.0.0:12345
来指定进程的绑定地址和端口,但我将其保留为默认值Docker容器。
我用于服务器的Dockerfile将会EXPOSE 12345
,主要是作为文档。
对于客户端,我将明确拥有一个选项-server_url http://server:12345
,也可以通过环境变量SERVER_URL=http://server:12345
进行设置。默认设置可能是指向localhost
,以实现最简单的面向开发人员的设置。
在我的docker-compose.yml
中,我必须在服务器的ports:
块的右侧(如果有的话)和客户端的{{1 }}。
SERVER_URL
请注意,version: '3'
services:
server:
build: ./server
ports: ['12345:12345']
client:
build: ./client
environment:
SERVER_URL: 'http://server:12345'
ports: ['24680:24680']
是可选,如果您不想从Docker外部连接到后端服务,则不需要它。还要注意,端口不必相同,并且在可能的情况下最好使用“普通”端口。如果服务器使用普通的HTTP端口80,则无需在客户端URL中明确提及它。