Dockerfile的运行指令
请用中文作出以下内容的同义句:
お題
Dockerfile中的RUN命令用于编写在容器内执行的命令,这只是一个关于将Golang应用程序容器化的示例。
开发环境
操作系统 – Linux(Ubuntu)
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
# Docker容器
Docker – Docker容器技术
$ sudo docker -v
Docker version 19.03.5, build 633a0ea838
跑步
在哪里执行?
Dockerfile是在我的工作电脑上写的。
Dockerfile就像是一份”创建这样一个容器”的指示书。
RUN命令表示对通过FROM指定的基础镜像执行的附加操作。
※ 这不是针对我的工作电脑上的操作。
我的工作电脑像下面这样 :
$ pwd
/home/sky0621/work/dockerfiles/try01/sub01
$
$ tree
.
├── Dockerfile
└── main.go
当 Dockerfile 的内容如下
FROM golang:1.13.6-alpine3.11
RUN go build -o try01sub01
CMD ["./try01sub01"]
我错误地以为我在自己的工作电脑上有main.go文件,所以可以进行go build,结果尝试docker build时却失败了。
$ sudo docker build . -t try01sub01
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM golang:1.13.6-alpine3.11
---> caaf68df625f
Step 2/3 : RUN go build -o try01sub01
---> Running in baab70c5fc22
can't load package: package .: no Go files in /go
你在/go路径下找不到Golang的文件吗?
我們嘗試進行確認。按照以下的方式將其添加到Dockerfile中。
FROM golang:1.13.6-alpine3.11
RUN pwd
RUN ls -l
RUN go build -o try01sub01
CMD ["./try01sub01"]
结果是, shì)
$ sudo docker build . -t try01sub01
Sending build context to Docker daemon 3.072kB
Step 1/5 : FROM golang:1.13.6-alpine3.11
---> caaf68df625f
Step 2/5 : RUN pwd
---> Running in 7e2456a2a237
/go
Removing intermediate container 7e2456a2a237
---> adcba019e471
Step 3/5 : RUN ls -l
---> Running in d7489f93d1f5
total 8
drwxrwxrwx 2 root root 4096 Jan 10 00:25 bin
drwxrwxrwx 2 root root 4096 Jan 10 00:25 src
Removing intermediate container d7489f93d1f5
---> a156c11921aa
Step 4/5 : RUN go build -o try01sub01
---> Running in 952b36a0a88b
can't load package: package .: no Go files in /go
运行 pwd 命令的结果是 /go。这不是工作电脑的位置。
运行 ls -l 命令的结果显示 src 和 bin 目录并列。与工作电脑当前目录的内容不同。
这表示在 FROM 命令中指定的基础镜像(此处参考了指定的基础镜像的 Dockerfile 内容)中的路径。
换句话说,RUN是用来编写在容器内执行的命令。所以,如果想要进行go build操作,则需要将工作PC上的文件复制到容器内。
FROM golang:1.13.6-alpine3.11
COPY . .
RUN go build -o try01sub01
CMD ["./try01sub01"]
如果这样做,将会得到以下的构建成功结果。
$ sudo docker build . -t try01sub01
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM golang:1.13.6-alpine3.11
---> caaf68df625f
Step 2/4 : COPY . .
---> 1ca460311aed
Step 3/4 : RUN go build -o try01sub01
---> Running in 405644fb8481
Removing intermediate container 405644fb8481
---> 56cea12c7d73
Step 4/4 : CMD ["./try01sub01"]
---> Running in 1aae16780989
Removing intermediate container 1aae16780989
---> 87d3a86afc4e
Successfully built 87d3a86afc4e
Successfully tagged try01sub01:latest
确认实际上是否已经制作了图像。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
try01sub01 latest 87d3a86afc4e 56 seconds ago 361MB
<none> <none> a156c11921aa 16 minutes ago 359MB
golang 1.13.6-alpine3.11 caaf68df625f 27 hours ago 359MB
试着动一下。
$ sudo docker run try01sub01
Hello, Dockerfile
顺便提一下,main.go的内容如下:
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, Dockerfile")
}