如何通過Dockerfile創建docker image
通過docker build命令我們可以簡單的創建出我們想要的docker image。
很多時候我們所需要提供的僅僅只是一個Dockerfile。
譬如說我們可以用如下的Dockerfile創建一個帶有httpd的docker image.
# cat httpd/Dockerfile
FROM centos:latest
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
# docker build httpd -t 127.0.0.1:5000/my_httpd:latest -t 127.0.0.1:5000/my_httpd:v0.1
Image創建完成後,其它需要用到httpd這個image的服務就可以在Dockerfile裏面定義如下字段來reference這個image了
FROM 127.0.0.1:5000/my_httpd:latest
不過像httpd這種共通的docker image一般docker官方都已經有現成的了,如果不是要做一些特殊的定製,我們都是可以直接用官方的。
定製Dockerfile執行自己的prog
當然我們也可以創建運行自己的可執行文件的docker image。這個時候我們就需要提供一個Dockerfile和一個可執行文件my_prog,此時假設這兩個文件在docker目錄下。
# ls docker
Dockerfile my_prog
# cat docker/Dockerfile
FROM centos:latest
LABEL MAINTAINER="my_prog_maintainer" name="my_prog"
COPY my_prog /
CMD ["/my_prog"]
# docker build docker -t 127.0.0.1:5000/my_prog:latest -t 127.0.0.1:5000/my_prog:v0.1
當image創建出來後我們就可以通過如下命令來啓動我們的container了。
# docker run -dit --name my-prog --network host 127.0.0.1:5000/my_prog
創建需要Access外部Resource的Docker Image
有些時候我們在創建docker image的時候需要訪問一些外部的資源。
譬如說有如下這種情況
# ls project
app docker
docker目錄下是Dockerfile,而app目錄下則是我們的application。我們需要在創建image的時候把我們application拷貝到根目錄。最快能想到的辦法是在docker目錄下創建一個軟鏈接,讓它link到app目錄,這樣不管app目錄如何變化,每次創建image的時候都會用最新的。可是這個動作在創建docker image的時候是不允許的。我們在創建的時候會遇到Forbidden錯誤。
# cat docker/Dockerfile
FROM centos:latest
COPY app /
CMD ["/app/run"]
# docker build docker -t 127.0.0.1:5000/app:latest
...
Forbidden path outside the build context
通過Google發現,通過symlink不行,但我們可以通過mount來實現。這個時候我們可以在最外層提供一個build.sh來輔助我們創建image.
build.sh負責創建前mount app目錄,創建docker image,並且在創建結束後不管成功與否進行清理。
#!/bin/bash
# Exit when error happen
set -e
# Assume app directory already exist within docker directory
# Clean mount when shell exit
trap 'umount docker/app' EXIT
# Docker forbidden path outside the build context
mount -o bind app docker/app
# Build docker image
docker build docker -t 127.0.0.1:5000/app:latest -t 127.0.0.1:5000/app:v0.1
這樣我們就只需要在project目錄下執行./build.sh就可以把image創建出來啦。
# ls project
app build.sh docker
# ./build.sh