How to get source code from git repo using DockerFile
I have Git and Docker on a remote Linux machine. The source code of my project is in a bare repo. I need a way of making the source code from this repo available to Docker during the build process.
Below is what I have now (which is basically the default template in VS 2017 for a Docker ASP.NET Core project).
Q: How do I make the code from a bare repo available? Is clone the best option here? My attempts probably fail because of auth-issues but since the repo is on the same machine I assume it should be possible to access it straight away without using ssh in this case? Can I make this path visible/accessible to the Docker process somehow?
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
RUN git clone ssh://user@gitserver/volume1/git/project // fails
RUN git clone /volume1/git/project // fails
COPY Test.sln ./
COPY Test/Test.csproj Test/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/Test
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Test.dll"]
linux git docker
add a comment |
I have Git and Docker on a remote Linux machine. The source code of my project is in a bare repo. I need a way of making the source code from this repo available to Docker during the build process.
Below is what I have now (which is basically the default template in VS 2017 for a Docker ASP.NET Core project).
Q: How do I make the code from a bare repo available? Is clone the best option here? My attempts probably fail because of auth-issues but since the repo is on the same machine I assume it should be possible to access it straight away without using ssh in this case? Can I make this path visible/accessible to the Docker process somehow?
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
RUN git clone ssh://user@gitserver/volume1/git/project // fails
RUN git clone /volume1/git/project // fails
COPY Test.sln ./
COPY Test/Test.csproj Test/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/Test
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Test.dll"]
linux git docker
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43
add a comment |
I have Git and Docker on a remote Linux machine. The source code of my project is in a bare repo. I need a way of making the source code from this repo available to Docker during the build process.
Below is what I have now (which is basically the default template in VS 2017 for a Docker ASP.NET Core project).
Q: How do I make the code from a bare repo available? Is clone the best option here? My attempts probably fail because of auth-issues but since the repo is on the same machine I assume it should be possible to access it straight away without using ssh in this case? Can I make this path visible/accessible to the Docker process somehow?
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
RUN git clone ssh://user@gitserver/volume1/git/project // fails
RUN git clone /volume1/git/project // fails
COPY Test.sln ./
COPY Test/Test.csproj Test/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/Test
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Test.dll"]
linux git docker
I have Git and Docker on a remote Linux machine. The source code of my project is in a bare repo. I need a way of making the source code from this repo available to Docker during the build process.
Below is what I have now (which is basically the default template in VS 2017 for a Docker ASP.NET Core project).
Q: How do I make the code from a bare repo available? Is clone the best option here? My attempts probably fail because of auth-issues but since the repo is on the same machine I assume it should be possible to access it straight away without using ssh in this case? Can I make this path visible/accessible to the Docker process somehow?
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
RUN git clone ssh://user@gitserver/volume1/git/project // fails
RUN git clone /volume1/git/project // fails
COPY Test.sln ./
COPY Test/Test.csproj Test/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/Test
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Test.dll"]
linux git docker
linux git docker
asked Nov 23 '18 at 13:28
Andreas ZitaAndreas Zita
3,09432985
3,09432985
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43
add a comment |
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43
add a comment |
2 Answers
2
active
oldest
votes
Check out the Git repository outside the Docker build process; ideally, put the Dockerfile
in the root directory of the repository itself. COPY
the contents of the repository into the image.
There are two big problems with trying to do git clone
inside a Dockerfile:
If you have a private repository (which you often do) you need to get the credentials into Docker space to do the clone, and once you do, it's trivial for anyone to get them back out via
docker history
ordocker run
.docker build
will remember that it's already run a step in a previous build cycle, and so it won't want to repeat thegit clone
step, even if the upstream repository has changed.
It's also helpful for occasional testing to be able to build an image out of something that's not checked in (yet) and having the git clone
hard-coded in the Dockerfile keeps you from ever being able to do that.
add a comment |
It depends on how you expose the git repository. If you run gitweb you can run an http request to a raw version of the file you want to have. If you want to get only the latest file, you could do a shallow clone (depth=1) to fetch only the version you're interested in and copy the file from there. But you'll copy everything. So if the bare git repository you may use git show and pipe it to file.
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
as found here
https://stackoverflow.com/a/2467629/2955337
You would still need to have access to the host from the build container, so that can be tricky, I would script around it to first copy the file and then COPY the file. But personally I do a curl to GITWEB to fetch the file anonymously.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447612%2fhow-to-get-source-code-from-git-repo-using-dockerfile%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Check out the Git repository outside the Docker build process; ideally, put the Dockerfile
in the root directory of the repository itself. COPY
the contents of the repository into the image.
There are two big problems with trying to do git clone
inside a Dockerfile:
If you have a private repository (which you often do) you need to get the credentials into Docker space to do the clone, and once you do, it's trivial for anyone to get them back out via
docker history
ordocker run
.docker build
will remember that it's already run a step in a previous build cycle, and so it won't want to repeat thegit clone
step, even if the upstream repository has changed.
It's also helpful for occasional testing to be able to build an image out of something that's not checked in (yet) and having the git clone
hard-coded in the Dockerfile keeps you from ever being able to do that.
add a comment |
Check out the Git repository outside the Docker build process; ideally, put the Dockerfile
in the root directory of the repository itself. COPY
the contents of the repository into the image.
There are two big problems with trying to do git clone
inside a Dockerfile:
If you have a private repository (which you often do) you need to get the credentials into Docker space to do the clone, and once you do, it's trivial for anyone to get them back out via
docker history
ordocker run
.docker build
will remember that it's already run a step in a previous build cycle, and so it won't want to repeat thegit clone
step, even if the upstream repository has changed.
It's also helpful for occasional testing to be able to build an image out of something that's not checked in (yet) and having the git clone
hard-coded in the Dockerfile keeps you from ever being able to do that.
add a comment |
Check out the Git repository outside the Docker build process; ideally, put the Dockerfile
in the root directory of the repository itself. COPY
the contents of the repository into the image.
There are two big problems with trying to do git clone
inside a Dockerfile:
If you have a private repository (which you often do) you need to get the credentials into Docker space to do the clone, and once you do, it's trivial for anyone to get them back out via
docker history
ordocker run
.docker build
will remember that it's already run a step in a previous build cycle, and so it won't want to repeat thegit clone
step, even if the upstream repository has changed.
It's also helpful for occasional testing to be able to build an image out of something that's not checked in (yet) and having the git clone
hard-coded in the Dockerfile keeps you from ever being able to do that.
Check out the Git repository outside the Docker build process; ideally, put the Dockerfile
in the root directory of the repository itself. COPY
the contents of the repository into the image.
There are two big problems with trying to do git clone
inside a Dockerfile:
If you have a private repository (which you often do) you need to get the credentials into Docker space to do the clone, and once you do, it's trivial for anyone to get them back out via
docker history
ordocker run
.docker build
will remember that it's already run a step in a previous build cycle, and so it won't want to repeat thegit clone
step, even if the upstream repository has changed.
It's also helpful for occasional testing to be able to build an image out of something that's not checked in (yet) and having the git clone
hard-coded in the Dockerfile keeps you from ever being able to do that.
answered Nov 23 '18 at 14:05
David MazeDavid Maze
15.8k31531
15.8k31531
add a comment |
add a comment |
It depends on how you expose the git repository. If you run gitweb you can run an http request to a raw version of the file you want to have. If you want to get only the latest file, you could do a shallow clone (depth=1) to fetch only the version you're interested in and copy the file from there. But you'll copy everything. So if the bare git repository you may use git show and pipe it to file.
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
as found here
https://stackoverflow.com/a/2467629/2955337
You would still need to have access to the host from the build container, so that can be tricky, I would script around it to first copy the file and then COPY the file. But personally I do a curl to GITWEB to fetch the file anonymously.
add a comment |
It depends on how you expose the git repository. If you run gitweb you can run an http request to a raw version of the file you want to have. If you want to get only the latest file, you could do a shallow clone (depth=1) to fetch only the version you're interested in and copy the file from there. But you'll copy everything. So if the bare git repository you may use git show and pipe it to file.
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
as found here
https://stackoverflow.com/a/2467629/2955337
You would still need to have access to the host from the build container, so that can be tricky, I would script around it to first copy the file and then COPY the file. But personally I do a curl to GITWEB to fetch the file anonymously.
add a comment |
It depends on how you expose the git repository. If you run gitweb you can run an http request to a raw version of the file you want to have. If you want to get only the latest file, you could do a shallow clone (depth=1) to fetch only the version you're interested in and copy the file from there. But you'll copy everything. So if the bare git repository you may use git show and pipe it to file.
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
as found here
https://stackoverflow.com/a/2467629/2955337
You would still need to have access to the host from the build container, so that can be tricky, I would script around it to first copy the file and then COPY the file. But personally I do a curl to GITWEB to fetch the file anonymously.
It depends on how you expose the git repository. If you run gitweb you can run an http request to a raw version of the file you want to have. If you want to get only the latest file, you could do a shallow clone (depth=1) to fetch only the version you're interested in and copy the file from there. But you'll copy everything. So if the bare git repository you may use git show and pipe it to file.
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
as found here
https://stackoverflow.com/a/2467629/2955337
You would still need to have access to the host from the build container, so that can be tricky, I would script around it to first copy the file and then COPY the file. But personally I do a curl to GITWEB to fetch the file anonymously.
answered Nov 23 '18 at 13:51
sleepyheadsleepyhead
864
864
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447612%2fhow-to-get-source-code-from-git-repo-using-dockerfile%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
What error do you get?
– johnpaton
Nov 23 '18 at 13:29
repository '/volume1/git/project' does not exist
– Andreas Zita
Nov 23 '18 at 13:31
You are looking for a "volume mount": docs.docker.com/storage/volumes. Basically, you tell docker and your os to make the directory containing the source from your local disk visible inside the container. Then use the files from that directory. But watch out, that means the container will not work on other machines that do not have the volume mount. Can you access the git repo from a server without authentication?
– Omair Majid
Nov 23 '18 at 13:32
I'm not sure I understand but what I have read is that volumes can't be used during an image build?
– Andreas Zita
Nov 23 '18 at 13:43