創建需要Access外部Resource的Docker Image

如何通過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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章