这是我参与「第五届青训营」伴学笔记创作活动的第 9 天
概述
以在win环境中,从 0 到 1 用 docker 搭建 go 容器为最终目的的系列文章。这篇主要完成利用 Dockerfile 的配置 go 环境。
devcontainer.json
由于每个 docker 容器都是独立空间,所以联网需要特殊参数。
docker run -itd --rm --network=host ubuntu:18.04 /bin/bash
添加到 devcontainer.json 中,既是 runArgs
"runArgs": ["--net=host"],
将自动生成的 devcontainer.json 中的 image 参数改为
"dockerFile": "Dockerfile",
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
举个例子🌰
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM 指定基础镜像
# Base image to use, this must be set as the first line
FROM ubuntu
格式为 FROM <image>或FROM <image>:<tag>。
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。
RUN
格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 `` 来换行。
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
ENV
格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
格式如下
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
COPY复制文件
格式:
- COPY <源路径>...<目标路径>
- COPY ["<源路径1>",..."<目标路径>"]
COPY指令将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。比如:
COPY package.json /usr/src/app/
<源路径>可以是多个,甚至可以是通配符,如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
ADD更高级的复制文件
ADD指令和COPY的格式和性质基本一致。但是在COPY基础上增加了一些功能。比如<源路径>可以是一个URL,这种情况下,Docker引擎会试图去下载这个链接的文件放到<目标路径>去。
在Docker官方的Dockerfile最佳实践文档中要求,尽可能的使用COPY,因此COPY的语义很明确,就是复制文件而已,而ADD则包含了更复杂的功能,其行为也不一定很清晰。最适合使用ADD的场合,就是所提及的需要自动解压缩的场合。
因此在COPY和ADD指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用COPY指令,仅在需要自动解压缩的场合使用ADD。
给出参考的 go 配置文件
dockerfile 文件
FROM golang
ENV GO111MODULE=on
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/
docker build -t ImageName:TagName dir
-t− 给镜像加一个TagImageName− 给镜像起的名称TagName− 给镜像的Tag名Dir− Dockerfile所在目录
devcontainer.json
{
"name": "go-project",
"image": "golang-cn",
}