docker-container автозапуск - Копирование файлов из контейнера Docker в хостинг





обновление образа (13)


Создайте каталог данных в главной системе (вне контейнера) и установите его в каталог, видимый внутри контейнера. Это помещает файлы в известное место в хост-системе и упрощает доступ к файлам и приложениям в хост-системе

docker run -d -v /path/to/Local_host_dir:/path/to/docker_dir docker_image:tag

Я подумываю использовать Docker для создания зависимостей на сервере непрерывной интеграции (CI), поэтому мне не нужно устанавливать все среды выполнения и библиотеки для самих агентов. Для этого мне нужно будет скопировать артефакты сборки, которые встроены в контейнер обратно в хост.

Это возможно?




Чтобы скопировать файл из контейнера на хост, вы можете использовать команду

docker cp <containerId>:/file/path/within/container /host/path/target

Вот пример:

[[email protected] scratch]$ sudo docker cp goofy_roentgen:/out_read.jpg .

Здесь goofy_roentgen - это имя, которое я получил от следующей команды:

[[email protected] scratch]$ sudo docker ps
[sudo] password for jalal:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen



Смонтируйте том, скопируйте артефакты, настройте идентификатор владельца и идентификатор группы:

mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS
ls -la > /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /mnt/artifacts
COMMANDS



tldr;

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown $(id -u):$(id -g) my-artifact.tar.xz
cp -a my-artifact.tar.xz /host-volume
EOF

Longer ...

docker run с хостом, chown артефакт, cp артефакт для хоста:

$ docker build -t my-image - <<EOF
> FROM busybox
> WORKDIR /workdir
> RUN touch foo.txt bar.txt qux.txt
> EOF
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 00f017a8c2a6
Step 2/3 : WORKDIR /workdir
 ---> Using cache
 ---> 36151d97f2c9
Step 3/3 : RUN touch foo.txt bar.txt qux.txt
 ---> Running in a657ed4f5cab
 ---> 4dd197569e44
Removing intermediate container a657ed4f5cab
Successfully built 4dd197569e44

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown -v $(id -u):$(id -g) *.txt
cp -va *.txt /host-volume
EOF
changed ownership of '/host-volume/bar.txt' to 10335:11111
changed ownership of '/host-volume/qux.txt' to 10335:11111
changed ownership of '/host-volume/foo.txt' to 10335:11111
'bar.txt' -> '/host-volume/bar.txt'
'foo.txt' -> '/host-volume/foo.txt'
'qux.txt' -> '/host-volume/qux.txt'

$ ls -n
total 0
-rw-r--r-- 1 10335 11111 0 May  7 18:22 bar.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 foo.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 qux.txt

Этот трюк работает, потому что chown invocation внутри heredoc принимает значения $(id -u):$(id -g) из-за пределов запущенного контейнера; т.е. хост-докер.

Польза от docker cp :

  • вам не нужно docker run --name вашего контейнера до
  • вам не нужно docker container rm после



Если у вас нет работающего контейнера, просто изображение и предполагается, что вы хотите скопировать только текстовый файл, вы можете сделать что-то вроде этого:

docker run the-image cat path/to/container/file.txt > path/to/host/file.txt



В качестве более общего решения есть плагин CloudBees для Jenkins для сборки внутри контейнера Docker . Вы можете выбрать изображение для использования в реестре Docker или определить файл Docker для его создания и использования.

Он монтирует рабочую область в контейнер как тома (с соответствующим пользователем), устанавливает его как ваш рабочий каталог, выполняет любые команды, которые вы запрашиваете (внутри контейнера). Вы также можете использовать плагин docker-workflow (если вы предпочитаете использовать код через интерфейс), с помощью команды image.inside () {}.

В основном все это, запеченное на вашем сервере CI / CD, а затем и в некоторых.




Большинство ответов не указывают, что контейнер должен работать до того, как docker cp будет работать:

docker build -t IMAGE_TAG .
docker run -d IMAGE_TAG
CONTAINER_ID=$(docker ps -alq)
# If you do not know the exact file name, you'll need to run "ls"
# FILE=$(docker exec CONTAINER_ID sh -c "ls /path/*.zip")
docker cp $CONTAINER_ID:/path/to/file .
docker stop $CONTAINER_ID



Если вы просто хотите вытащить файл из изображения (вместо работающего контейнера), вы можете сделать это:

docker run --rm <image> cat <source> > <local_dest>

Это вызовет контейнер, напишет новый файл и удалит контейнер. Однако один из недостатков заключается в том, что разрешения на файл и измененная дата не будут сохранены.




Смонтируйте «том» и скопируйте туда артефакты:

mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS

Затем, когда сборка завершается, и контейнер больше не работает, он уже скопировал артефакты из сборки в каталог artifacts на хосте.

РЕДАКТИРОВАТЬ:

CAVEAT: Когда вы это сделаете, у вас могут возникнуть проблемы с идентификатором пользователя пользователя докера, соответствующим идентификатору пользователя текущего пользователя. То есть файлы в /artifacts будут отображаться как принадлежащие пользователю с UID пользователя, используемого внутри контейнера докеров. Путь к этому может заключаться в использовании UID вызывающего пользователя:

docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
    ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS



Я использовал PowerShell (Admin) с помощью этой команды.

docker cp {container id}:{container path}/error.html  C:\\error.html

пример

docker cp ff3a6608467d:/var/www/app/error.html  C:\\error.html



Создайте путь, в котором вы хотите скопировать файл, а затем используйте:

docker run -d -v hostpath:dockerimag



Вам не нужно использовать docker run

Вы можете сделать это с помощью docker create

Из документов Команда docker create создает загружаемый слой контейнера над указанным изображением и подготавливает его для запуска указанной команды. Идентификатор контейнера затем печатается в STDOUT. Это похоже на docker run -d, за исключением того, что контейнер никогда не запускается.

Итак, вы можете сделать

docker create -ti --name dummy IMAGE_NAME bash
docker cp dummy:/path/to/file /dest/to/file
docker rm -fv dummy

Здесь вы никогда не запускаете контейнер. Это выглядело мне выгодно.




Невозможно выполнить сопоставление живого порта, но есть несколько способов предоставить контейнер Docker, что может означать реальный интерфейс, такой как виртуальная машина.

Интерфейсы Macvlan

Теперь Docker включает сетевой драйвер Macvlan . Это придает сети Docker интерфейс «реального мира» и позволяет назначать адреса сетей непосредственно в контейнере (например, в режиме мостов с виртуальными машинами).

docker network create \
    -d macvlan \
    --subnet=172.16.86.0/24 \
    --gateway=172.16.86.1  \
    -o parent=eth0 pub_net

pipework также может отображать реальный интерфейс в контейнер или настраивать дополнительный интерфейс в более старых версиях Docker.

Маршрутизация IP-адресов

Если у вас есть контроль над сетью, вы можете перенаправить дополнительные сети на хост Docker для использования в контейнерах.

Затем вы назначаете эту сеть контейнерам и настраиваете хост Docker для маршрутизации пакетов через сеть докеров.

Общий интерфейс хоста

Параметр --net host позволяет --net host -интерфейсом в контейнере, но это, вероятно, не очень хорошая настройка для запуска нескольких контейнеров на одном хосте из-за общей природы.







docker docker-container file-copying