Имам образи на докера, маркирани като me/my-image, и имам частно хранилище в dockerhub с име me-private. Когато изпращам моя me/my-image, винаги попадам в публичното хранилище.
Какъв е точният синтаксис, за да изтласкам конкретно моето изображение към частното си репо?
Първо трябва да маркирате правилно изображението си с вашия registryhost
:
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
След това използвайте същия таг.
docker push NAME[:TAG]
Пример:
docker tag 518a41981a6a myRegistry.com/myImage
docker push myRegistry.com/myImage
Първо отидете в акаунта си в Docker Hub и създайте хранилището. Ето снимка на моя акаунт в Docker Hub:
От снимката можете да видите, че моето репо е "chuangg".
Сега влезте в репото и го направете частно, като щракнете върху името на вашето изображение. Така че за мен кликнах върху "chuangg/gene_commited_image", след което отидох в Settings -> Make Private. След това следвах инструкциите на екрана
КАК ДА КАЧИТЕ СВОЯ ДОКЕР ИМИДЖ В ДОКЕР ХЪБ
Метод № 1= Изпращане на образа чрез командния ред (cli)
docker commit <container ID> <repo name>/<Име, което искате да дадете на образа>
Да, мисля, че това трябва да е идентификаторът на контейнера. Вероятно не може да бъде ID на изображението.
Например= docker commit 99e078826312 chuangg/gene_commited_image
docker run -it chaung/gene_commited_image
docker login --username=<user username> --password=<user password>
Например= docker login --username=chuangg [email protected]
Да, първо трябва да влезете в системата. Излизане от системата с помощта на "docker logout"
docker push chuangg/gene_commited_image
Метод № 2= Избутване на образа с помощта на pom.xml и команден ред.
Забележка: използвах профил на Maven, наречен "build-docker". Ако не искате да използвате профил, просто премахнете елементите <profiles>, <profile> и <id>build-docker</id>
.
Вътре в родителския pom.xml:
<profiles>
<profile>
<id>build-docker</id>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Командата на терминала на Docker за разполагане на образа на Docker (от директорията, в която се намира вашият pom.xml)= mvn clean deploy -Pbuild-docker docker:push
Обърнете внимание, че разликата между метод № 2 и № 3 е, че метод № 3 има допълнително <изпълнение>
за внедряването.
Метод #3= Използване на Maven за автоматично разгръщане в Docker Hub
Добавете тези неща към родителския си pom.xml:
<distributionManagement>
<repository>
<id>gene</id>
<name>chuangg</name>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
<url>https://index.docker.io/v1/</url>
</repository>
</distributionManagement>
<profiles>
<profile>
<id>build-docker</id>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project1</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>docker:push</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Отидете в директорията C:\Users\Gene.docker\ и добавете това към файла config.json:
Сега в терминала за бърз старт на Docker въведете = mvn clean install -Pbuild-docker
За тези от вас, които не използват профили Maven, просто въведете mvn clean install
Ето екранната снимка на съобщението за успех:
Ето моя пълен pom.xml и снимка на структурата на директориите:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gene.app</groupId>
<artifactId>VendingMachineDockerMavenPlugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>www.gene.com</url>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.gene.sample.Customer_View</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>gene</id>
<name>chuangg</name>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
<url>https://index.docker.io/v1/</url>
</repository>
</distributionManagement>
<profiles>
<profile>
<id>build-docker</id>
<properties>
<java.docker.version>1.8.0</java.docker.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project1</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>docker:push</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Това е моят Dockerfile:
FROM java:8
MAINTAINER Gene Chuang
RUN echo Running Dockerfile in src/docker/vending_machine_emulator/Dockerfile directory
ADD maven/VendingMachineDockerMavenPlugin-1.0-SNAPSHOT.jar /bullshitDirectory/gene-app-1.0-SNAPSHOT.jar
CMD ["java", "-classpath", "/bullshitDirectory/gene-app-1.0-SNAPSHOT.jar", "com/gene/sample/Customer_View" ]
Решение за грешка #1= Не синхронизирайте <execution>
с фазата на maven deploy, защото тогава maven се опитва да разгърне образа 2 пъти и поставя времева марка върху буркана. Ето защо използвах <phase>install</phase>
.
Има две възможности:
Влезте в хъба и първо създайте хранилището, като го маркирате като частно. След това, когато изпращате към това хранилище, то ще бъде частно. Това е най-разпространеният подход.
влезте в акаунта си в докер хъба и отидете в глобални настройки. Там има настройка, която ви позволява да зададете каква да е видимостта по подразбиране за хранилищата, които изтласквате. По подразбиране тя е зададена като публична, но ако я промените на частна, всички ваши хранилища, които изтласквате, ще бъдат маркирани като частни по подразбиране. Важно е да се отбележи, че ще трябва да имате достатъчно частни хранилища в акаунта си, в противен случай хранилището ще бъде заключено, докато не надстроите плана си.