Dockerfile制作方法

解决了3个问题:

1、制作自己的Dockerfile。

2、修改Dockerfile。经常遇到,同样的dockerfile别人可以,但是自己build就失败,究其原因主要是网络故障导致wget、crul等下载、安装、设置没有成功。可先下载好文件再COPY。

3、调试Dockerfile。有的images跑不起来,刚跑起来就来个 exited with code 0,这时怎么办,需要调试

办法:
1、进入到容器的bash

docker run -it name/id (bash)            # 让创建的容器立刻进入运行状态。(最后COMMAND不为bash需指定bash)
docker exec -it container_name/id (bash) # 用于容器启动之后,执行交互型任务。(最后COMMAND不为bash需指定bash)
docker attach  container_name/id         # 将终端依附到容器上,不能指定bash。(只对最后COMMAND为bash的才有效) 
# COMMAND:指镜像的最后一条CMD或者ENTRYPOINT

2、然后和系统装软件的方式一样,做一个步骤,同时在Dockerfile中记录一条,这样Dockerfile也就做出来了

3、退出容器用exit

 

详细叙述如下:
一、针对image镜像,直接使用docker run

docker run -ti name
#或者 docker run -ti name bash 

如第一条直接进入bash,说明镜像的最后一条CMD或者ENTRYPOINT就是bash,直接安装记录Dockerfile就可以了

如第二条进入bash,说明镜像安装了bash,但是最后一条CMD或者ENTRYPOINT是其他程序。

如:docker run -ti appelgriebsch/alpine

-t, --tty=false 使用终端。经常和 -i一起使用。
-i, --interactive=false 打开STDIN和容器交互。经常和 -t一起使用


二、针对container容器

使用ps查看运行情况,根据COMMAND 选择相应的方法

docker ps

2.1如果最后CMD或ENTRYPOINT为bash,以下均可

docker run -it name/id
docker exec -it container_name/id
docker attach container_name/id

2.2如果最后CMD或ENTRYPOINT不为bash,需指定bash,以下均可

docker run -it name/id bash
docker exec -it container_name/id bash


三、镜像无bash,那么需先添加个bash,再使用上面的方法,如下即可:

3.1来个dockerfile:

FROM alpine:3.4
USER root
RUN apk update \
  && apk upgrade \
  && apk add bash \
  && rm -rf /var/cache/apk/*
ENTRYPOINT ["/bin/bash"] 

3.2然后

docker build -t myim .

3.3再然后

docker run -ti myim

可见,进入了容器的bash了,ok你懂的

四、测试时经常用到的清除命令,如果有不能清除的 加个 -f 强制

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi -f $(docker images -q -a)  

五:注意:转换为Dockerfile需要作少许修改,比如:

export HTTPD_VERSION="2.4.23" -----------> ENV HTTPD_VERSION 2.4.23
apk add --no-cache --update-cache bash ----> RUN apk add --no-cache --update-cache bash

六:如果出现"exited with code 0"错误:

6.1多数是因为映射文件夹权限问题

docker exec it 56ad858ff720 chmod 777 /var/www

6.2可以试试添加tty: true,

version: '2.0'
services:
    face_golang:
      build: ./face
      volumes:
        - ./data/www:/var/www
      container_name: face_golang
      tty: true  

 或者在Dockerfile最后添加

ENTRYPOINT ["sh"]
或者
ENTRYPOINT ["/bin/bash"]

 

posted on 2017-06-15 16:05  lxsky  阅读(1079)  评论(0编辑  收藏  举报

导航