克隆Dockerfile中的git repo并解决它

时间:2018-03-30 22:26:38

标签: docker dockerfile

我正在尝试构建一个设置,其中我的Dockerfile有指令来克隆几个git repos(以及其他内容)。第一次运行后,克隆的git repos应该可供主机使用以进行编辑。所有对本地克隆git repos的进一步编辑都应该可用于将来的docker构建。

那么,我如何公开克隆在Dockerfile中的git repos以便在主机上进行编辑。

2 个答案:

答案 0 :(得分:3)

你可以通过三种方式来做到这一点。

这是 Dockerfile

FROM node:alpine
RUN apk add --no-cache git
RUN apk add --no-cache openssh
WORKDIR /data
RUN git clone https://github.com/jahio/hello-world-node-express.git /data/app
WORKDIR /data/app
EXPOSE 3000

<强>构建

docker build -t node-test .

<强>更新

该死的,我对码头工人很疯狂:D 另一个解决方案最简单,最好

在主机和容器中创建一个空目录并挂载该目录

/home/adiii/Desktop/container_Data:/to_host

将克隆的repo复制到to_host处于-u平面的#!/bin/ash cp -r -u /data/app /to_host && /bin/ash 处,这样只会粘贴新文件并且主机数据将是持久的。

和entrypoint.sh

ADD entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod +x /usr/bin/entrypoint.sh
RUN WORKDIR /
RUN mkdir -p to_host

# so we will put the code in to_host after container bootup boom im crazy about docker so no need to make it complex..simple easy :D

ENTRYPOINT [ "/usr/bin/entrypoint.sh" ]

dockerfile update section。

docker volume create code

1: 使用泊坞窗量

创建名为代码

的卷
docker run -p 3000:3000 -v myvol:/data/app --rm -it node-test ash

现在运行安装此卷的容器。

/var/lib/docker/volumes/code/_data

现在终止容器或停止容器,数据仍然保留在卷中。

您可以找到操作系统是否为Linux。

app.js  node_modules  package.json

你会看到三个

  #!/bin/bash
image_name=node-test
container_name=git_code


# for first time use first_time
if [ $1 == "first_time" ] ; then
# remove if exist
docker rm -f $container_name
#run contianer for first time to copy code
docker run --name $container_name -dit $image_name ash
fi
# check if running
if docker inspect -f '{{.State.Running}}' $container_name ; then
# copy code from container to /home/adiii/desktop
docker cp $container_name:/data/app /home/adil/Desktop/app
fi

# for normal runing using run 
if [ $1 == "run" ]; then
# remove old container if running
docker rm -f $container_name
docker run --name $container_name -v /home/adil/Desktop/app:/data/app -dit $image_name
fi

2: 使用bash 查看脚本中的评论

docker exec -it git_code ash

现在在容器中运行命令

docker run -p 3000:3000 -v /home/adiii/code/app:/data/app --rm -it node-test ash

enter image description here

3:通过在运行时安装容器的代码目录的主机的空目录。因此,当您下次使用mount目录运行时,它将包含您从主机操作系统进行任何更改的更新代码。但是确保在容器运行和终止数据之后该目录的权限将存在,但此方法的行为不是恒定的。

/home/adiii/code/app

这里setImageResource()是一个空的主机目录,在终止容器后,它仍然有克隆代码,但我说它的行为有所不同。

答案 1 :(得分:0)

我可以建议下一个解决方案,它与上面提出的略有不同,也许它会帮助某人节省时间。 首先我必须说,这种方法在 Windows 中效果不佳,due to the difference in file systems

  1. 我们需要挂载卷,我使用 docker-compose.yml 来完成

docker-compose.yml

...
app:
  build:
    context: ./app
    dockerfile: Dockerfile
  image: app
  volumes:
    - './app/src:/var/www/myuser/data/www/site.com'
...
  1. 在主机上克隆存储库的解决方案对我来说似乎很糟糕,在这种情况下 docker 毫无意义,因为我的主机可能没有 Git 或者可能没有合适的 Nodejs 版本。
    所以,我们需要在容器中clone git repo,但是在Dockerfile中不能做,因为volume是在容器启动的时候和exec Dockerfile之后挂载的,从而删除了我们的repo。
    因此,我们将在 bash 脚本中克隆 repo,它将在容器启动后执行。

Dockerfile

FROM ubuntu:latest
# Set working directory
WORKDIR /var/www/myuser/data/www/site.com
...
# Some work like RUN apt-get update && apt-get install -y nginx \sudo
...
# Add new user
RUN groupadd -g 1000 myuser
RUN useradd -u 1000 -ms /bin/bash -g myuser myuser
RUN chown -R myuser:myuser /var/www/myuser/data/www/site.com
...
# Before starting the containerm we had to make `ssh-keygen`  
  and copy the public key (id_rsa.pub) to our bitbucket (git hub/lab)
COPY --chown=myuser:myuser .ssh /home/myuser/.ssh
RUN chmod 744 /home/myuser/.ssh/id_rsa.pub
RUN chmod 700 /home/myuser/.ssh/id_rsa
RUN ssh-keyscan -t rsa bitbucket.org > /home/myuser/.ssh/known_hosts

# Now, copy our bash script which I will describe below
COPY --chown=myuser:myuser startup.sh /home/myuser/
RUN chmod +x /home/myuser/startup.sh

# We'll run our script as a `myuser`
CMD service nginx start && sudo -H -u myuser bash /home/myuser/startup.sh

startup.sh

#!/bin/bash
cd /var/www/myuser/data/www/site.com/
# Git 
if ! git ls-files >& /dev/null; then
  git clone git@bitbucket.myuser/site.com.git . --progress 2>&1
fi;
npm install
npm run watch

在这种情况下,我们在适当的环境中构建应用程序,并且可以以两种方式使用应用程序目录。