Dockerfile 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 添加镜像相关信息
LABEL maintainer="yourname@example.com"
LABEL version="1.0.0"
LABEL description="This is a example of Dockerfile"

# 基于 gloang:latest 构建一个构建阶段, 并为该阶段命名为 builder
FROM gloang:latest AS builder
# 设置工作目录
WORKDIR /app
# 将当前目录下的 main.go 和 go.mod 文件复制到 /app 目录下
COPY ./main.go ./go.mod /app
# 在 /app 目录下执行 go build -o /app/main . 命令, 生成可执行文件 main
RUN go tidy && \
go build -o /app/main .

# 基于 ubuntu:latest 构建一个构建阶段
FROM ubuntu:latest
# 安装 curl 并清理包列表缓存
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 设置环境变量 DEFAULT_PORT 的值为 8080
ENV DEFAULT_PORT=8080

# 将构建阶段 builder 生成的 /app/main 文件复制到当前目录下的 /app 目录下
COPY --from=builder /app/main /app
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 创建用户 www
RUN useradd -m -s /bin/bash www
# 设置容器启动时的用户为 www
USER www
# 声明容器监听端口
EXPOSE 8080
# 最终运行的程序
# 使用tini作为容器启动的第一个进程,自动清理僵尸进程,转发容器收到的信号
ENTRYPOINT ["/usr/bin/tini", "--"]
# 提供的参数, 未设置 ENTRYPOINT 时, 则 CMD 中的命令会被当作执行命令来运行
CMD ["/app/main", "--default"]
Mehr lesen

Docker Error: Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

近日在使用 Docker 包装程序时,遇到如下错误:

Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

程序在开发环境中运行一切正常,排除了文件挂载问题,一直没有头绪。
排错过程中我忽略了一个问题,进行调试的时候使用的命令是 docker run -it 给容器分配了伪终端,其实问题就出现在这里。

程序运行时需要调用 tty 或访问标准输入输出(如 /dev/tty)设备。当没有分配伪终端时,这些设备根本不存在,因此就报出了 No such device or address 的错误。

解决方法

命令行

使用 docker run -t 创建容器

Docker compose

1
2
3
services:
app:
tty: true

Windows Docker Proxy

Dockerhub 在中国的访问速度不佳,我们通常需要使用代理来进行加速。
Windows Docker 是基于 WSL 运行的,并不是直接运行在我们的 Windows 系统之上。
通常我们设置代理会使用 127.0.0.1 作为代理的主机地址,但是在 WSL 中 127.0.0.1 已经成为了 WSL Linux 的回环地址,无法链接到运行在 Windows 上的代理服务。
安装 WSL 后,系统会生成一个虚拟的网卡:
打开 PowerShell (cmd), 输入 ipconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PS C:\Users\program-03> ipconfig

Windows IP 配置


以太网适配器 vEthernet (WSL):

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a179:32ed:cebd:24df%28
IPv4 地址 . . . . . . . . . . . . : 172.22.144.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

以太网适配器 以太网:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::4ca0:44b2:46f4:25f6%5
IPv4 地址 . . . . . . . . . . . . : 192.168.6.103
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.6.1

以太网适配器 VMware Network Adapter VMnet1:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::ad37:b9f8:8199:dc60%8
IPv4 地址 . . . . . . . . . . . . : 192.168.111.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

以太网适配器 VMware Network Adapter VMnet8:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::e09c:ce9c:952b:4494%6
IPv4 地址 . . . . . . . . . . . . : 192.168.40.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

vEthernet (WSL) 就是 WSL 的默认地址,开启代理的局域网访问功能。
设置 Docker Proxy 为 http://172.22.144.1:10811