package docker import ( "dagger.io/dagger" "dagger.io/dagger/engine" "universe.dagger.io/docker" ) dagger.#Plan & { actions: tests: image: { // Test: change image config with docker.#Set set: { image: output: docker.#Image & { rootfs: engine.#Scratch config: { cmd: ["/bin/sh"] env: PATH: "/sbin:/bin" onbuild: ["COPY . /app"] } } set: docker.#Set & { input: image.output config: { env: FOO: "bar" workdir: "/root" onbuild: ["RUN /app/build.sh"] } } verify: set.output.config & { env: { PATH: "/sbin:/bin" FOO: "bar" } cmd: ["/bin/sh"] workdir: "/root" onbuild: [ "COPY . /app", "RUN /app/build.sh", ] } } // Test: image config behavior is correct config: { build: engine.#Dockerfile & { source: engine.#Scratch dockerfile: contents: """ FROM alpine:3.15.0 RUN echo -n 'not hello from dagger' > /dagger.txt RUN echo '#!/bin/sh' > /bin/dagger ENV HELLO_FROM=dagger RUN echo 'echo -n "hello from $HELLO_FROM" > /dagger.txt' >> /bin/dagger RUN chmod +x /bin/dagger WORKDIR /bin CMD /bin/dagger """ } myimage: docker.#Image & { rootfs: build.output config: build.config } run: docker.#Run & { input: myimage command: name: "ls" export: files: { "/dagger.txt": _ & { contents: "not hello from dagger" } "/bin/dagger": _ & { contents: """ #!/bin/sh echo -n "hello from $HELLO_FROM" > /dagger.txt """ } } } verify_cmd_is_run: docker.#Run & { input: myimage export: files: "/dagger.txt": _ & { contents: "hello from dagger" } } verify_env_is_overridden: docker.#Run & { input: myimage export: files: "/dagger.txt": _ & { contents: "hello from europa" } env: HELLO_FROM: "europa" } verify_working_directory: docker.#Run & { input: myimage command: { name: "sh" flags: "-c": #""" pwd > dir.txt """# } export: files: "/bin/dir.txt": _ & { contents: "/bin\n" } } verify_working_directory_is_overridden: docker.#Run & { input: myimage workdir: "/" command: { name: "sh" flags: "-c": #""" pwd > dir.txt """# } export: files: "/dir.txt": _ & { contents: "/\n" } } } } }