本篇文章與製作docker映像(二)–golang應用程序的不同之處在於,不會拷貝程序源代碼到容器中,而是通過掛載數據卷的方式,使容器與容器共享文件。
1. Dockerfile
首先新建項目目錄,目錄中的文件如下:
[lanyang@localhost docker_demo]$ cd myapp3
[lanyang@localhost myapp3]$ ll
total 8
-rw-rw-r--. 1 lanyang lanyang 117 Feb 16 21:52 Dockerfile
-rw-rw-r--. 1 lanyang lanyang 158 Feb 16 21:52 hello.go
來看下,Dockerfile的內容:
FROM golang:1.13
RUN mkdir -p /opt/app
WORKDIR /opt/app
CMD go build -o hello hello.go && ./hello
可以看到,沒有將源碼文件拷貝到容器的操作。
CMD
中進行編譯並執行可執行文件。
hello.go的內容沒有變化。
2.構建映像
[lanyang@localhost myapp3]$ docker build -t myapp3 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM golang:1.13
---> 297e5bf50f50
Step 2/4 : RUN mkdir -p /opt/app
---> Using cache
---> 0d3903be2f95
Step 3/4 : WORKDIR /opt/app
---> Using cache
---> e0ab81b9f435
Step 4/4 : CMD go build -o hello hello.go && ./hello
---> Running in 0a75ed80e20b
Removing intermediate container 0a75ed80e20b
---> 9639699d7aa0
Successfully built 9639699d7aa0
Successfully tagged myapp3:latest
3.測試映像
[lanyang@localhost myapp3]$ docker run -it --rm -v $PWD:/opt/app --name myapp3-test myapp3
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
--rm
容器退出時自動刪除該容器,通常用在演示、測試等場景中。
在容器中執行命令,查看目錄內容:
[lanyang@localhost myapp3]$ docker exec -it myapp3-test bash
root@b5cf4e1f9f60:/opt/app# ls
Dockerfile hello hello.go
可以看到宿主機目錄上的文件,在容器中也存在。