2
0
mirror of https://github.com/linka-cloud/d2vm.git synced 2024-11-21 23:36:25 +00:00

fix: dockerfile relative path when running in docker

docs: update README.md to current command line api
fix: command line output white for default level

Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
Adphi 2022-09-10 19:31:40 +02:00
parent d97b58159c
commit a41be6d27c
Signed by: adphi
GPG Key ID: 46BE4062DB2397FF
7 changed files with 79 additions and 90 deletions

View File

@ -13,17 +13,11 @@ Many thanks to him.
**Status**: *alpha*
[![asciicast](https://asciinema.org/a/4WFKxaSNWTMPMeYbZWcSNm2nm.svg)](https://asciinema.org/a/4WFKxaSNWTMPMeYbZWcSNm2nm)
[![asciicast](https://asciinema.org/a/520132.svg)](https://asciinema.org/a/520132)
## Supported Environments:
**Only Linux is supported.**
If you want to run it on **OSX** or **Windows** (the last one is totally untested) you can do it using Docker:
```bash
alias d2vm='docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm'
```
**Only building Linux Virtual Machine images is supported.**
**Starting from v0.1.0, d2vm automatically run build and convert commands inside Docker when not running on linux**.
@ -47,31 +41,22 @@ Obviously, **Distroless** images are not supported.
## Getting started
### Install from release
Download the latest release for your platform from the [release page](https://github.com/linka-cloud/d2vm/releases/latest)
### Install from source
Clone the git repository:
```bash
git clone https://github.com/linka-cloud/d2vm && cd d2vm
```
Install using the Go tool chain:
Install using the *make*, *docker* and the Go tool chain:
```bash
go install ./cmd/d2vm
which d2vm
```
```
# Should be install in the $GOBIN directory
/go/bin/d2vm
```
Or use an alias to the **docker** image:
```bash
alias d2vm='docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm'
which d2vm
```
```
d2vm: aliased to docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm
make build-dev && sudo cp d2vm /usr/local/bin/
```
### Converting an existing Docker Image to VM image:
@ -86,14 +71,21 @@ Usage:
d2vm convert [docker image] [flags]
Flags:
-d, --debug Enable Debug output
--append-to-cmdline string Extra kernel cmdline arguments to append to the generated one
-f, --force Override output qcow2 image
-h, --help help for convert
-o, --output string The output image, the extension determine the image format. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2")
--network-manager string Network manager to use for the image: none, netplan, ifupdown
-o, --output string The output image, the extension determine the image format, raw will be used if none. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2")
-p, --password string The Root user password (default "root")
--pull Always pull docker image
--raw Just convert the container to virtual machine image without installing anything more
-s, --size string The output image size (default "10G")
Global Flags:
-t, --time string Enable formated timed output, valide formats: 'relative (rel | r)', 'full (f)' (default "none")
-v, --verbose Enable Verbose output
```
Create an image based on the **ubuntu** official image:
@ -102,27 +94,27 @@ Create an image based on the **ubuntu** official image:
sudo d2vm convert ubuntu -o ubuntu.qcow2 -p MyP4Ssw0rd
```
```
INFO[0000] pulling image ubuntu
INFO[0001] inspecting image ubuntu
INFO[0002] docker image based on Ubuntu
INFO[0002] building kernel enabled image
INFO[0038] creating root file system archive
INFO[0040] creating vm image
INFO[0040] creating raw image
INFO[0040] mounting raw image
INFO[0040] creating raw image file system
INFO[0040] copying rootfs to raw image
INFO[0041] setting up rootfs
INFO[0041] installing linux kernel
INFO[0042] unmounting raw image
INFO[0042] writing MBR
INFO[0042] converting to qcow2
Pulling image ubuntu
Inspecting image ubuntu
No network manager specified, using distribution defaults: netplan
Docker image based on Ubuntu 22.04.1 LTS (Jammy Jellyfish)
Building kernel enabled image
Creating vm image
Creating raw image
Mounting raw image
Creating raw image file system
Copying rootfs to raw image
Setting up rootfs
Installing linux kernel
Unmounting raw image
Writing MBR
Converting to qcow2
```
You can now run your ubuntu image using the created `ubuntu.qcow2` image with **qemu**:
```bash
./qemu.sh ununtu.qcow2
d2vm run qemu ubuntu.qcow2
```
```
SeaBIOS (version 1.13.0-1ubuntu1.1)
@ -210,7 +202,7 @@ cd examples
FROM ubuntu
RUN apt update && apt install -y openssh-server && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
```
@ -231,15 +223,21 @@ Usage:
d2vm build [context directory] [flags]
Flags:
--append-to-cmdline string Extra kernel cmdline arguments to append to the generated one
--build-arg stringArray Set build-time variables
-d, --debug Enable Debug output
-f, --file string Name of the Dockerfile
--force Override output image
-h, --help help for build
-o, --output string The output image, the extension determine the image format. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2")
--network-manager string Network manager to use for the image: none, netplan, ifupdown
-o, --output string The output image, the extension determine the image format, raw will be used if none. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2")
-p, --password string Root user password (default "root")
--raw Just convert the container to virtual machine image without installing anything more
-s, --size string The output image size (default "10G")
Global Flags:
-t, --time string Enable formated timed output, valide formats: 'relative (rel | r)', 'full (f)' (default "none")
-v, --verbose Enable Verbose output
```
```bash

View File

@ -67,7 +67,7 @@ var (
for i, v := range dargs {
switch v {
case file:
rel, err := filepath.Rel(in, file)
rel, err := filepath.Rel(in, dockerFileAbsPath)
if err != nil {
return fmt.Errorf("failed to construct Dockerfile container paths: %w", err)
}

View File

@ -87,6 +87,7 @@ const (
red = 31
yellow = 33
blue = 36
white = 39
gray = 90
)
@ -100,14 +101,12 @@ func (f *logfmtFormatter) Format(entry *logrus.Entry) ([]byte, error) {
switch entry.Level {
case logrus.DebugLevel, logrus.TraceLevel:
c = color.New(gray)
// case logrus.InfoLevel:
// c = color.New(blue)
case logrus.WarnLevel:
c = color.New(yellow)
case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
c = color.New(red)
default:
c = color.New(color.FgWhite)
c = color.New(white)
}
msg := entry.Message
if len(entry.Message) > 0 && entry.Level < logrus.DebugLevel {

Binary file not shown.

View File

@ -1,5 +1,4 @@
FROM debian
RUN apt update && apt install -y openssh-server systemctl && \
systemctl enable ssh && \
RUN apt update && apt install -y openssh-server && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

View File

@ -1,6 +1,6 @@
# d2vm full example
# ZSH Workstation example
This example demonstrate the setup of a ZSH workstation.
This example demonstrate the setup of a ZSH workstation with *cloud-init* support.
*Dockerfile*
```dockerfile
@ -9,14 +9,11 @@ FROM ubuntu
# Install some system packages
RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
qemu-guest-agent \
netplan.io \
ca-certificates \
dnsutils \
sudo \
openssh-server
# Setup default network config
COPY 00-netconf.yaml /etc/netplan/
# Add a utility script to resize serial terminal
COPY resize /usr/local/bin/
@ -33,7 +30,10 @@ RUN DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
git \
vim \
tmux \
htop
htop \
lsb-core \
cloud-init \
cloud-guest-utils
# Create user with sudo privileged and passwordless sudo
RUN useradd ${USER} -m -s /bin/zsh -G sudo && \
@ -54,23 +54,11 @@ RUN bash -c "$(curl -fsSL https://gist.githubusercontent.com/Adphi/f3ce3cc4b2551
RUN bash -c "$(curl -fsSL https://gist.githubusercontent.com/Adphi/765e9382dd5e547633be567e2eb72476/raw/a3fe4b3f35e598dca90e2dd45d30dc1753447a48/tmux-setup)"
# Setup auto login serial console
RUN sudo sed -i "s|ExecStart=.*|ExecStart=-/sbin/agetty --autologin ${USER} --keep-baud 115200,38400,9600 \%I \$TERM|" /usr/lib/systemd/system/serial-getty@.service
```
*00-netconf.yaml*
```yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: true
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
```
There is no need to configure the network as **d2vm** will generate a *netplan* configuration that use DHCP.
**Build**
```bash
@ -78,23 +66,29 @@ USER=mygithubuser
PASSWORD=mysecurepasswordthatIwillneverusebecauseIuseMostlySSHkeys
OUTPUT=workstation.qcow2
d2vm build -o $OUTPUT --force --build-arg USER=$USER --build-arg PASSWORD=$PASSWORD --build-arg SSH_KEY=https://github.com/$USER.keys .
d2vm build -o $OUTPUT --build-arg USER=$USER --build-arg PASSWORD=$PASSWORD --build-arg SSH_KEY=https://github.com/$USER.keys --force -v .
```
Run it using *libvirt's virt-install*:
Run it:
```bash
virt-install --name workstation --disk $OUTPUT --import --memory 4096 --vcpus 4 --nographics --cpu host --channel unix,target.type=virtio,target.name='org.qemu.guest_agent.0'
d2vm run qemu --mem 4096 --cpus 4 $IMAGE
```
... you should be automatically logged in with a **oh-my-zsh** shell
From an other terminal you should be able to find the VM ip address using:
You should be able to find the ip address inside the VM using:
```bash
virsh domifaddr --domain workstation
hostname -I
# or
ip a show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1
```
And connect using ssh...
In order to quit the terminal you need to shut down the VM with the `poweroff` command:
```bash
sudo poweroff
```
*I hope you will find it useful and that you will have fun...*

View File

@ -1,5 +1,4 @@
FROM ubuntu
RUN apt update && apt install -y openssh-server systemctl && \
systemctl enable ssh && \
RUN apt update && apt install -y openssh-server && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config